gpt4 book ai didi

python - 如何在 python 中使用 opencv 模块可视化描述符匹配

转载 作者:太空狗 更新时间:2023-10-29 20:34:30 25 4
gpt4 key购买 nike

我正在尝试将 opencv 与 python 结合使用。我在 opencv 2.4 的 C++ 版本中编写了描述符(SIFT、SURF 或 ORB)匹配代码。我想用 python 将这段代码转换为 opencv。我找到了一些关于如何在 C++ 中使用 opencv 函数的文档,但是在 python 中的许多 opencv 函数我找不到如何使用它们。这是我的 python 代码,我目前的问题是我不知道如何在 python 中使用 opencv c++ 的“drawMatches”。我找到了 cv2.DRAW_MATCHES_FLAGS_DEFAULT 但我不知道如何使用它。这是我使用 ORB 描述符进行匹配的 python 代码:

im1 = cv2.imread(r'C:\boldt.jpg')
im2 = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
im3 = cv2.imread(r'C:\boldt_resize50.jpg')
im4 = cv2.cvtColor(im3, cv2.COLOR_BGR2GRAY)

orbDetector2 = cv2.FeatureDetector_create("ORB")
orbDescriptorExtractor2 = cv2.DescriptorExtractor_create("ORB")
orbDetector4 = cv2.FeatureDetector_create("ORB")
orbDescriptorExtractor4 = cv2.DescriptorExtractor_create("ORB")

keypoints2 = orbDetector2.detect(im2)
(keypoints2, descriptors2) = orbDescriptorExtractor2.compute(im2,keypoints2)
keypoints4 = orbDetector4.detect(im4)
(keypoints4, descriptors4) = orbDescriptorExtractor4.compute(im4,keypoints4)
matcher = cv2.DescriptorMatcher_create('BruteForce-Hamming')
raw_matches = matcher.match(descriptors2, descriptors4)
img_matches = cv2.DRAW_MATCHES_FLAGS_DEFAULT(im2, keypoints2, im4, keypoints4, raw_matches)
cv2.namedWindow("Match")
cv2.imshow( "Match", img_matches);

“img_matches = cv2.DRAW_MATCHES_FLAGS_DEFAULT(im2, keypoints2, im4, keypoints4, raw_matches)”这一行的错误信息

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'long' object is not callable

我花了很多时间搜索在 python 中使用 opencv 函数的文档和示例。但是,我很沮丧,因为在python中使用opencv函数的信息很少。如果有人可以教我在哪里可以找到有关如何在 python 中使用 opencv 模块的每个功能的文档,那将非常有帮助。感谢您抽出时间提供帮助。

最佳答案

我自己也写了一些只使用 OpenCV Python 接口(interface)的东西,我没有使用 scipydrawMatches 是 OpenCV 3.0.0 的一部分,而不是我目前使用的 OpenCV 2 的一部分。尽管我迟到了,但这是我自己的实现,它尽我所能模仿 drawMatches

我提供了自己的图片,其中一张是摄影师,另一张是同一张照片,但逆时针旋转了 55 度。

我写的基本前提是我分配了一个输出 RGB 图像,其中行数是两个图像中的最大值,以适应将两个图像都放在输出图像中,列只是两列在一起。我将每个图像放在相应的位置,然后遍历所有匹配关键点的循环。我提取了两个图像之间匹配的关键点,然后提取它们的 (x,y) 坐标。然后我在每个检测到的位置画圆圈,然后画一条线将这些圆圈连接在一起。

请记住,第二张图片中检测到的关键点是相对于它自己的坐标系的。如果要将其放置在最终输出图像中,则需要将列坐标偏移第一张图像的列数,以便列坐标相对于输出图像的坐标系.

事不宜迟:

import numpy as np
import cv2

def drawMatches(img1, kp1, img2, kp2, matches):
"""
My own implementation of cv2.drawMatches as OpenCV 2.4.9
does not have this function available but it's supported in
OpenCV 3.0.0

This function takes in two images with their associated
keypoints, as well as a list of DMatch data structure (matches)
that contains which keypoints matched in which images.

An image will be produced where a montage is shown with
the first image followed by the second image beside it.

Keypoints are delineated with circles, while lines are connected
between matching keypoints.

img1,img2 - Grayscale images
kp1,kp2 - Detected list of keypoints through any of the OpenCV keypoint
detection algorithms
matches - A list of matches of corresponding keypoints through any
OpenCV keypoint matching algorithm
"""

# Create a new output image that concatenates the two images together
# (a.k.a) a montage
rows1 = img1.shape[0]
cols1 = img1.shape[1]
rows2 = img2.shape[0]
cols2 = img2.shape[1]

out = np.zeros((max([rows1,rows2]),cols1+cols2,3), dtype='uint8')

# Place the first image to the left
out[:rows1,:cols1,:] = np.dstack([img1, img1, img1])

# Place the next image to the right of it
out[:rows2,cols1:cols1+cols2,:] = np.dstack([img2, img2, img2])

# For each pair of points we have between both images
# draw circles, then connect a line between them
for mat in matches:

# Get the matching keypoints for each of the images
img1_idx = mat.queryIdx
img2_idx = mat.trainIdx

# x - columns
# y - rows
(x1,y1) = kp1[img1_idx].pt
(x2,y2) = kp2[img2_idx].pt

# Draw a small circle at both co-ordinates
# radius 4
# colour blue
# thickness = 1
cv2.circle(out, (int(x1),int(y1)), 4, (255, 0, 0), 1)
cv2.circle(out, (int(x2)+cols1,int(y2)), 4, (255, 0, 0), 1)

# Draw a line in between the two points
# thickness = 1
# colour blue
cv2.line(out, (int(x1),int(y1)), (int(x2)+cols1,int(y2)), (255, 0, 0), 1)


# Show the image
cv2.imshow('Matched Features', out)
cv2.waitKey(0)
cv2.destroyAllWindows()

为了说明这是有效的,这里是我使用的两个图像:

enter image description here

enter image description here

我使用 OpenCV 的 ORB 检测器来检测关键点,并使用归一化的汉明距离作为相似性的距离度量,因为这是一个二进制描述符。因此:

import numpy as np
import cv2

img1 = cv2.imread('cameraman.png') # Original image
img2 = cv2.imread('cameraman_rot55.png') # Rotated image

# Create ORB detector with 1000 keypoints with a scaling pyramid factor
# of 1.2
orb = cv2.ORB(1000, 1.2)

# Detect keypoints of original image
(kp1,des1) = orb.detectAndCompute(img1, None)

# Detect keypoints of rotated image
(kp2,des2) = orb.detectAndCompute(img2, None)

# Create matcher
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

# Do matching
matches = bf.match(des1,des2)

# Sort the matches based on distance. Least distance
# is better
matches = sorted(matches, key=lambda val: val.distance)

# Show only the top 10 matches
drawMatches(img1, kp1, img2, kp2, matches[:10])

这是我得到的图像:

enter image description here

关于python - 如何在 python 中使用 opencv 模块可视化描述符匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11114349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com