cv2.KeyPoint
时间: 2023-10-19 14:57:00 浏览: 198
cv2.KeyPoint是OpenCV中的一个类,用于表示图像中的特征点。可以使用cv2.KeyPoint来创建一个特征点,设置它们的坐标、大小等属性。例如,可以使用kp=cv2.KeyPoint(x=1,y=2,size=3)来创建一个坐标为(1,2)、大小为3的特征点。在计算机视觉中,特征点是图像中具有显著性的局部区域,常用于图像匹配、目标跟踪等任务。SIFT算法就是一种用于检测和描述图像特征点的算法,它使用了cv2.KeyPoint来表示检测到的特征点。在示例代码中,SIFT算法从输入图像中检测到一系列特征点,并使用cv2.drawKeypoints函数将特征点绘制在图像上。最后,将带有特征点的图像保存到sift_keypoints.jpg文件中。
相关问题
Traceback (most recent call last): File "C:\Users\86158\PycharmProjects\pythonProject\11111111.py", line 22, in <module> kp_left, des_left = orb.compute(img_left, [cv2.KeyPoint(x[1], x[0], 5) for x in keypoints_left]) File "C:\Users\86158\PycharmProjects\pythonProject\11111111.py", line 22, in <listcomp> kp_left, des_left = orb.compute(img_left, [cv2.KeyPoint(x[1], x[0], 5) for x in keypoints_left]) cv2.error: OpenCV(4.6.0) :-1: error: (-5:Bad argument) in function 'KeyPoint' > Overload resolution failed: > - Argument 'x' can not be safely parsed to 'float'
这个错误通常是由于关键点的坐标类型不正确引起的。你可以尝试将关键点的坐标类型从整数转换为浮点数类型,如下所示:
```python
# 选取角点
keypoints_left = np.float32([np.array([x[1], x[0]], dtype=np.float32) for x in np.argwhere(harris_left > 0.01 * harris_left.max())])
keypoints_right = np.float32([np.array([x[1], x[0]], dtype=np.float32) for x in np.argwhere(harris_right > 0.01 * harris_right.max())])
# 计算描述符
orb = cv2.ORB_create()
kp_left, des_left = orb.compute(img_left, [cv2.KeyPoint(x[0], x[1], 5) for x in keypoints_left])
kp_right, des_right = orb.compute(img_right, [cv2.KeyPoint(x[0], x[1], 5) for x in keypoints_right])
```
在这里,我们首先将角点的坐标类型转换为浮点数类型(float32),然后再使用ORB.compute函数计算描述符时,将坐标的顺序也进行了修改。
这个修改应该可以解决你遇到的问题,如果还有其他问题,请随时告诉我。
我对superpoint在github上发布的superpoint_v1.pth文件进行了修改,想提取原图像的特征点并绘制,修改的部分代码如下 : start1 = time.time() pts, desc, heatmap = fe.run(img) # 转换特征点为cv2.KeyPoint对象 cv_keypoints = [cv2.KeyPoint(point[0], point[1], 1) for point in pts[0]] image_color = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) # 绘制特征点 image_with_keypoints = cv2.drawKeypoints(image_color, cv_keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow('Image with Keypoints', image_with_keypoints) cv2.waitKey(0) cv2.destroyAllWindows() 错误信息如下: Traceback (most recent call last): File "D:/SuperPointPretrainedNetwork-master/demo1.py", line 683, in <module> flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.error: C:\projects\opencv-python\opencv\modules\features2d\src\draw.cpp:108: error: (-5) Incorrect type of input image. in function cv::drawKeypoints warning: Error opening file (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:792) warning: ./assets/icl_snippet/ (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:793) 我改如何修改
根据错误信息,问题出现在 `cv2.drawKeypoints` 函数中,错误提示是 "Incorrect type of input image"。这意味着 `image_color` 的类型不正确。
根据您提供的代码,`image_color` 是使用 `cv2.cvtColor` 函数从灰度图像转换为彩色图像的结果。但是,错误信息表明转换后的图像类型不正确。
您可以尝试使用以下方法解决该问题:
1. 确保 `img` 是正确的灰度图像。可以使用 `cv2.imread` 读取图像,并在读取时指定 `cv2.IMREAD_GRAYSCALE` 参数。
2. 使用 `cv2.cvtColor` 将读取的灰度图像转换为彩色图像时,确保正确指定转换的颜色空间。例如,使用 `cv2.COLOR_GRAY2BGR` 将灰度图像转换为 BGR 彩色图像。
3. 在调用 `cv2.drawKeypoints` 之前,检查 `image_color` 的类型,确保它是正确的彩色图像类型(例如,numpy 数组)。
尝试按照上述步骤检查和修改代码,并确保输入图像的类型正确,以解决该错误。
阅读全文