我正在使用OpenCV-Python。
我使用cv2.cornerHarris
识别了角点。输出的类型为dst
。
我需要计算角点的SIFT特征。 sift.compute()
的输入必须是KeyPoint
类型。
我无法弄清楚如何使用cv2.KeyPoint()
。
我该怎么做?
答案 0 :(得分:3)
Harris探测器返回dst,与您的图像具有相同的形状。哈里斯在dst上的标记,它认为角落。因此,您必须从dst中提取关键点。
def harris(self, img):
'''
Harris detector
:param img: an color image
:return: keypoint, image with feature marked corner
'''
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray_img = np.float32(gray_img)
dst = cv2.cornerHarris(gray_img, 2, 3, 0.04)
result_img = img.copy() # deep copy image
# Threshold for an optimal value, it may vary depending on the image.
result_img[dst > 0.01 * dst.max()] = [0, 0, 255]
# for each dst larger than threshold, make a keypoint out of it
keypoints = np.argwhere(dst > 0.01 * dst.max())
keypoints = [cv2.KeyPoint(x[1], x[0], 1) for x in keypoints]
return (keypoints, result_img)
答案 1 :(得分:0)
我认为你完全弄错了。 输出的类型为" dst" - >请注意,函数cv2.cornerHarris返回的 dst 是包含图像中检测到的Harris角的浮点Mat。
我在python中使用的代码示例用于计算图像中的角。您可以使用返回数据并将其转换为KeyPoints类型。请注意,关键点结构定义为OpenCV KeyPoint Structure,每个关键点由Point2f类型的图像空间2d坐标指定。只需将每个检测到的角转换为Point2f并将其用于筛选功能。
#sample code to read image and estimate the harris corner.
import cv2
import numpy as np
def cvComputeHarrisCorner(img):
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04)
dst = cv2.dilate(dst,None)
img[dst>0.01*dst.max()]=[0,0,255]
return img
def main():
img = cv2.imread('img.jpg')
cvComputeHarrisCorner(img)
cv2.imshow('dst',img)
if cv2.waitKey(0) & 0xff == 27:
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
不是在这里解释你需要的所有内容,而是指导你参加这个OpenCV Python教程,该教程编写得非常好并在后台解释。请仔细阅读,然后逐步了解这个概念。