異なるビューで撮影された同じオブジェクトの 2 つの画像があります。私の目的は、2 つの画像から一致するキーポイントを見つけることです。次に、1 つの画像からキーポイントを選択し、対応するエピポーラ線を別の画像に描画します。実験にはPythonとOpenCVを使用しています。2 つの画像からキーポイントとマスポイントを見つけることができました。ポイント対応が描けました。
しかし、 python cv2 モジュールComputeCorrespondEpilines()
で関数 ' 'を見つけることができません。numpy配列を使用しているため、この関数を使用するために cv モジュールを使用できません。cv2には機能がないようです。ComputeCorrespondEpilines()
で numpy を使用すると、次のcv.ComputeCorrespondEpilines()
エラーが発生します。
cv.ComputeCorrespondEpilines(mp_array,1, cv.fromarray(F1),cv.fromarray(liness))
TypeError: object does not have array interface
(mp_array
タプルのnumpy配列です。)
mp_array
をタプル s のリストに変換しました。しかし、同じエラーが発生しました。
これが私のコードです:
import cv
import cv2
import sys
import scipy as sp
import numpy as np
img1_path = sys.argv[1]
img2_path = sys.argv[2]
img1_ = cv2.imread(img1_path, cv2.CV_LOAD_IMAGE_GRAYSCALE)
img2_ = cv2.imread(img2_path, cv2.CV_LOAD_IMAGE_GRAYSCALE)
detector = cv2.FeatureDetector_create("SIFT")
descriptor = cv2.DescriptorExtractor_create("BRIEF")
matcher = cv2.DescriptorMatcher_create("BruteForce-Hamming")
detect keypoints
kp1 = detector.detect(img1)
kp2 = detector.detect(img2)
print '#keypoints in image1: %d, image2: %d' % (len(kp1), len(kp2))
# descriptors
k1, d1 = descriptor.compute(img1, kp1)
k2, d2 = descriptor.compute(img2, kp2)
print '#descriptors in image1: %d, image2: %d' % (len(d1), len(d2))
# match the keypoints
matches = matcher.match(d1, d2)
dist = [m.distance for m in matches]
print 'distance: min: %.3f' % min(dist)
print 'distance: mean: %.3f' % (sum(dist) / len(dist))
print 'distance: max: %.3f' % max(dist)
# threshold: half the mean
thres_dist = (sum(dist) / len(dist)) * 0.5
# keep only the reasonable matches
sel_matches = [m for m in matches if m.distance < thres_dist]
print '#selected matches:', len(sel_matches)
points1=[];#1
points2=[];#1
# #####################################
# visualization
h1, w1 = img1_.shape[:2]
h2, w2 = img2_.shape[:2]
view = sp.zeros((max(h1, h2), w1 + w2, 3), sp.uint8)
view[:h1, :w1, 0] = img1_
view[:h2, w1:, 0] = img2_
view[:, :, 1] = view[:, :, 0]
view[:, :, 2] = view[:, :, 0]
for m in sel_matches:
# draw the keypoints
# print m.queryIdx, m.trainIdx, m.distance
match_point.append(k1[m.queryIdx].pt)
pt1=list(k1[m.queryIdx].pt)
pt1=[int(ii) for ii in pt1]
pt2=list((k2[m.trainIdx].pt[0] + w1, k2[m.trainIdx].pt[1]))
pt2=[int(ii) for ii in pt2]
points1.append(pt1);#1
points2.append(pt2);#1
color = tuple([sp.random.randint(0, 255) for _ in xrange(3)])
cv2.line(view, tuple(pt1), tuple(pt2), color)
points1=np.asarray(points1,dtype=float);
points2=np.asarray(points2,dtype=float);
liness=[]
F1,mask=cv2.findFundamentalMat(points1,
points2,method=cv.CV_FM_RANSAC,param1=1,param2=0.99);
print F1
#points1 = cv.fromarray(points1)
#cv.ComputeCorrespondEpilines(points1,2, F1,liness)
#cv.ComputeCorrespondEpilines(cv.fromarray(points1),
1,cv.fromarray(F1),cv.fromarray(liness))
mp_array=np.asarray(match_point,dtype=np.int)
print type(match_point)
print type(match_point[0])
print type(mp_array)
print mp_array
cv.ComputeCorrespondEpilines(match_point,1, cv.fromarray(F1),cv.fromarray(liness))