Python中的三维规范化互相关

时间:2012-07-30 22:04:05

标签: python 3d correlation

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

1 个答案:

答案 0 :(得分:2)

你的意思是你正在寻找图像中某个地方的已知对象,而你目前只能处理被仿射变换的对象(在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和该矩阵来对齐图像。或者您可以使用之前找到的匹配点集来做其他事情。