如何创建 KeyPoints 来计算 SIFT?

sin*_*ald 6 python opencv sift

我正在使用 OpenCV-Python。

我已经使用cv2.cornerHarris. 输出类型为dst

我需要计算角点的 SIFT 特征。输入sift.compute()必须是 类型KeyPoint

我无法弄清楚如何使用cv2.KeyPoint().

我该怎么做呢?

Hah*_*pro 6

Harris 检测器返回 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)
Run Code Online (Sandbox Code Playgroud)


kcc*_*c__ 1

我认为你完全搞错了。 输出的类型为“dst” --> 请注意,函数 cv2.cornerHarris 返回的dst是一个浮点 Mat,包含图像中检测到的 Harris 角点。

我在 python 中使用的代码示例在这里用于计算图像中的角点。您可以使用返回数据并将其转换为 KeyPoints 类型。请注意,关键点结构定义为OpenCV KeyPoint Structure,每个关键点由 Point2f 类型的图像空间 2d 坐标指定。只需将每个检测到的角点转换为 Point2f 并将其用于 sift 函数即可。

#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()                                                                                  
Run Code Online (Sandbox Code Playgroud)

我不会在这里解释您需要的所有内容,而是引导您阅读这个 OpenCV Python 教程,该教程在主干中写得很好并且解释得很好。请仔细阅读它们,您将逐渐了解这个概念。

OpenCV Python 教程