今,opencvのpythonでimage stitchingを学んでいる大学生です。
imageStitcher関数で画像を繋げることができたので特徴量を抽出してから各画像ごとにmatchingすることを目標にこのコードを書いています。二つの画像を入力してその特徴量の抽出とマッチングをすることができたので入力を複数画像にしようと試みたところエラーが出て行き詰まってしまったので質問させていただいている次第です。
1枚目がのコードのスクリーンショットが成功した2画像の入力です。
2枚目のスクリーンショットがエラーがでて画像も生成されずに困っているコードです。
ちなみにIn[2]までは実行できたのでそこまでに間違いはないと思っています。
おそらくfor文に問題があると思うのですが自分では今何が間違っていて実行できていないのかわかりません。
どなたかわかる方返信よろしくお願いします。
すみません....
成功したコード↓
python
1import cv2 2import numpy as np 3img_ = cv2.imread('./IMG_9644.JPG') 4img1 = cv2.cvtColor(img_, cv2.COLOR_BGR2GRAY) 5img = cv2.imread('./IMG_9646.JPG') 6img2 = cv2.cvtColor(img_, cv2.COLOR_BGR2GRAY) 7sift = cv2.SIFT_create() 8#find keypoints 9kp1, des1 = sift.detectAndCompute(img1,None) 10kp2, des2 = sift.detectAndCompute(img2,None) 11match = cv2.BFMatcher() 12matches = match.knnMatch(des1, des2, k =2) 13good = [] 14for m,n in matches: 15 if m.distance < 0.5*n.distance: 16 good.append([m]) 17img3 = cv2.drawMatchesKnn(img_, kp1, img, kp2,good,None,flags=2) 18cv2.imshow('IMG_drawMatches',img3) 19cv2.waitKey(0)
失敗したコード↓
python
1mport cv2 2import numpy as np 3import glob 4 5image_path=glob.glob('/view_img/*.JPG') 6images = [] 7kp = [] 8gray = [] 9des =[] 10feature = [] 11for image in image_path: 12 img = cv2.imread(image) 13 images.append(img) 14 cv2.imshow("Image",img) 15 cv2.waitKey(0)#0を画像上で入力すると次の画像へ 16#print(img) 17 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#グレースケール 18 cv2.imshow('grayImg',gray) 19 cv2.waitKey(0) 20 sift = cv2.SIFT_create() 21 #find keypoints 22 kp,des =sift.detectAndCompute(gray,None)#kpには特徴点の座標の情報、desには特徴量記述子の情報が格納 23cv2.imshow('IMG_keypoints', cv2.drawKeypoints(img,kp,None)) 24cv2.waitKey(0) 25 26matches =[] 27match = cv2.BFMatcher() 28for i in range(len(img)): 29 for j in range(len(img)): 30 if i!= j: 31 matches = match.knnMatch(des[i], des[j], k=2) 32 good = [] 33# Apply ratio test 34for m,n in matches: 35 if m.distance < 0.5*n.distance: 36 good.append([m]) 37 feature = cv2.drawMatchesKnn(img[i], kp[i], img[j], kp[j], good, None, flags=2) 38 #cv2.imwrite("f'fea{i:03d}.png",feature) 39 cv2.imshow('IMG_drawMatches',feature) 40cv2.waitKey(0)
IndexError Traceback (most recent call last) /var/folders/fm/c943c_r93bzd8zk1ht89x4dr0000gn/T/ipykernel_3610/2609149258.py in <module> 4 for j in range(len(img)): 5 if i!= j: ----> 6 matches = match.knnMatch(des[i], des[j], k=2) 7 good = [] 8 # Apply ratio test IndexError: index 1414 is out of bounds for axis 0 with size 1414
このように表示されました。