0

現在、Python から呼び出される OpenCV の MatchTemplate 関数を使用して 2D テンプレート マッチングを行っています。コードを 3D に拡張しようとしていますが、既存の 3D 相互相関プログラムが見つかりません。誰でも助けてもらえますか?

4

1 に答える 1

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サンプルの1つからのものです)。

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を使用して、2つの画像を整列させる変換を見つけることができます。

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とそのマトリックスを使用して画像を整列させることができます。または、以前に見つかった一致したポイントのセットを使用して、他のことを行うこともできます。

于 2012-08-12T20:59:34.397 に答える