いつもお世話になっています。
前提・実現したいこと
2つの画像
(1つは風景画像(A.jpg)もう1つは風景画像の部分トリミング画像(B.jpg))
の特徴点を取得し、マッチするところに線を引いてもらう
マッチング処理をしようと思っています。
下記のコードを実行すると、src_ptsのところでストップしてしまいます。
VisualStudioではハンドルされていない例外として
下記のエラーメッセージが出ました。
メッセージの意味を調べてみると、queryIdxが存在していないとあったのですが、
変数m内にはqueryIdxが存在していて、何のことかわかりませんでした。
エラーメッセージでググってみると、5.のサイトがヒットしました。
ベストアンサーを見てみると、
goodにmを追加するとよいとあるのですが、
どのように追加するのかよく分かりません。
他の参考にしたサイトでは、同じコードで動いていたのですが、
何が良くなかったのでしょうか。
参考にしたサイトは
1.【opencv 基礎知識 #4】動画の手ぶれ補正をpython実装 (AKAZE, KNN, RANSAC)
2.画像から特徴量を抽出し、透視変換行列を導出して画像を変形する
3.特徴点のマッチングとHomographyによる物体検出
4.OpenCVで特徴量の座標を取得する
5.OpenCV : AttributeError: 'list' object has no attribute 'queryIdx'
です。
発生している問題・エラーメッセージ
'list' object has no attribute 'queryIdx'
該当のソースコード
python3
1import cv2 2import numpy as np 3 4MIN_MATCH_COUNT = 10 5 6# 画像ファイルの読み込み 7img1 = cv2.imread('A.jpg') 8img2 = cv2.imread('B.jpg') 9 10# AKAZE 11detector = cv2.AKAZE_create() # keypoints|7334 12 13# 特徴量の検出と特徴量ベクトルの計算 14kp1, des1 = detector.detectAndCompute(cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY), None) 15kp2, des2 = detector.detectAndCompute(cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY), None) 16 17# Brute-Force Matcher生成 18bf = cv2.BFMatcher() 19 20# 特徴量ベクトル同士をBrute-Force&KNNでマッチング 21matches = bf.knnMatch(des1, des2, k=2) 22 23# データを間引きする 24ratio = 0.5 25good = [] 26for m, n in matches: 27 if m.distance < ratio * n.distance: 28 good.append([m]) 29 30# 対応する特徴点同士を描画 31img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2) 32 33if len(good)>MIN_MATCH_COUNT: 34 src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2) 35 dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) 36 M, mask = cv2.findHomography(dst_pts, src_pts, cv2.RANSAC) 37 38height, width = img2.shape 39img2_trans = cv2.warpPerspective(img2, np.linalg.inv(M), (width, height)) 40 41# 表示 42cv2.imshow("keypoints", img2_trans) 43 44cv2.waitKey(0) 45cv2.destroyAllWindows()
補足情報(FW/ツールのバージョンなど)
Python3.7
OpenCV4.1
VisualStudio2019
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。