ステレオ ペアがあり、視差マップを作成したいと考えています。ただし、2 つのイメージ間のシフトは、単純に左から右または上下ではなく、2 つの何らかの組み合わせで行われます。Open CV Python で StereoBM 関数を使用しようとしましたが、結果に画像全体に斜めの黒と白の線が表示されます。私の質問は、視差が対角線方向にある 2 つの画像を使用して視差マップを計算することは可能ですか、それとも、この関数が機能するために画像を回転させる必要がありますか?
編集: 以下の回答を読み、いくつかの調査を行った後、stereoRectifyUncalibrated 関数を試すことにしました。最初の画像で SURF を使用してキー ポイントを見つけ、2 番目の画像でこれを繰り返します。次に、FLANN ベースのマッチャーを使用してポイントを照合し、外れ値を削除します。次に、findFundamentalMat 関数を使用して基本的なマットを見つけてから、stereoRectifyUn calibrationd を呼び出します。ただし、次のように始まるエラーが発生します: (-215) CV_IS_MAT(_points1) && CV_IS_MAT(_points2) && (_points1->rows == 1 || _points1->cols == 1) &&...
すべてのデータ型が同じであること、および各点配列が同じ次元であることを確認しました。以下に、stereoRectifyUncalibrated を使用するコードの一部を示します。
#Detect feature points with SURF
detector = cv2.SURF()
kp1, desc1 = detector.detectAndCompute(img1, None)
kp2, desc2 = detector.detectAndCompute(img2, None)
#Match Points
FLANN_INDEX_KDTREE = 1 # bug: flann enums are missing
flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
matcher = cv2.FlannBasedMatcher(flann_params, {})
matches = matcher.knnMatch(desc1, trainDescriptors = desc2, k=2)
mkp1, mkp2 = [], []
ratio = 0.75
for m in matches:
if len(m) == 2 and m[0].distance < m[1].distance * ratio:
m = m[0]
mkp1.append( kp1[m.queryIdx] )
mkp2.append( kp2[m.trainIdx] )
np.float32([kp.pt for kp in mkp1])
p1 = np.float32([kp.pt for kp in mkp1])
p2 = np.float32([kp.pt for kp in mkp2])
kp_pairs = zip(mkp1, mkp2)
H, status = cv2.findHomography(p1, p2, cv2.RANSAC, 5.0)
print '%d / %d inliers/matched' % (np.sum(status), len(status))
statusmat = np.zeros((max(status.shape),2),dtype = np.float64)
statusmat[:,0] = status[:,0]
statusmat[:,1] = status[:,0]
status = np.array(status, dtype=bool)
p1f=p1[status.view(np.ndarray).ravel()==1,:] #Remove Outliers
p2f=p2[status.view(np.ndarray).ravel()==1,:] #Remove Outliers
#Attempt to rectify using stereoRectifyUncalibrated
fundmat, mask = cv2.findFundamentalMat(p1f,p2f,cv2.RANSAC,3,0.99,)
rectmat1, rectmat2 = cv2.stereoRectifyUncalibrated(p1f,p2f,fundmat,imgsize)
これまでの回答をありがとう!