【问题标题】:3D normalised cross-correlation in PythonPython中的3D归一化互相关
【发布时间】:2012-07-30 22:04:05
【问题描述】:

我目前正在使用从 Python 调用的 OpenCV 的 MatchTemplate 函数进行 2D 模板匹配。我希望将我的代码扩展到 3D,但找不到任何现有的 3D 互相关程序。有人可以帮忙吗?

【问题讨论】:

    标签: python 3d correlation


    【解决方案1】:

    您的意思是您当前正在图像中某处寻找已知对象,并且您目前只能处理正在仿射变换的对象(在 2D 平面上移动),但您希望能够处理是透视变换吗?

    您可以尝试使用 SURF 或 SIFT 算法在您的参考图像和未知图像中查找特征:

    def GetSurfPoints(image, mask)
        surfDetector = cv2.FeatureDetector_create("SURF")
        surfExtractor = cv2.DescriptorExtractor_create("SURF")
        keyPoints = surfDetector.detect(image, mask)
        keyPoints, descriptions = surfExtractor.compute(image, keyPoints)
        return keyPoints, descriptions
    

    然后使用 FLANN 查找匹配点(这是来自 cv2 样本之一):

    def MatchFlann(desc1, desc2, r_threshold = 0.6):
        FLANN_INDEX_KDTREE = 1  # bug: flann enums are missing
        flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 4)
        flann = cv2.flann_Index(desc2, flann_params)
        idx2, dist = flann.knnSearch(desc1, 2, params = {}) # bug: need to provide empty dict
        mask = dist[:,0] / dist[:,1] < r_threshold
        idx1 = numpy.arange(len(desc1))
        matches = numpy.int32( zip(idx1, idx2[:,0]) )
        return matches[mask]
    

    现在,如果您愿意,您可以使用 FindHomography 来找到对齐两个图像的转换:

    referencePoints = numpy.array([keyPoints[match[0]].pt for match in matches])
    newPoints = numpy.array([keyPoints[match[1]].pt for match in matches])
    transformMatrix, mask = cv2.findHomography(newPoints, referencePoints, method = cv2.cv.CV_LMEDS)
    

    然后您可以使用 WarpPerspective 和该矩阵来对齐图像。或者,您可以对之前找到的匹配点集执行其他操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2017-09-24
      • 1970-01-01
      相关资源
      最近更新 更多