最終的にやりたいこと
背景の同じでない2つの画像の差分を取る
今回やったこと
参考をもとに2枚の画像から特徴量を抽出してマッチングを行った
使ったもの
元々はopencvのチュートリアルのにあるコードを動かそうと思っっていたが著作権の関係でSHIFTを使うことができなかったので同様の処理を行えるかつより強力なAKAZEを用いた.
結果
感想と今後の予定
特徴量の抽出からマッチングまできちんとできたがやはり植物といった自然のものよりも人工物に特徴があるんだなと思った
次は特徴をもとに位置合わせを行って2枚の差分をとりたい
コード
参考のものを使わせてもらいました. ありがとうございます.
import cv2
#画像を読み込む
#画像1, 2
img1 = cv2.imread('image_1.png')
img2 = cv2.imread('image_2.png')
#AKAZE検出器の生成
akaze = cv2.AKAZE_create()
#画像を読み込んで特徴量を計算する
#kp = keypoints(特徴点), des = descriptors(特徴点描画)
#detectAndCompute() => (kp: 特徴点の一覧, des:獲得頂点の特徴量記述子)のタプル
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)
#特徴量のマッチングを行う
#総当たりマッチング(Brute-Force Matcher)を生成
bf = cv2.BFMatcher()
#特徴量ベクトル同士をBrute-ForceとKNNでマッチング
matches = bf.knnMatch(des1, des2, k=2)
#データをマッチングの精度が高いもののみ抽出する
ratio = 0.6
good = []
for m, n in matches:
if m.distance < ratio * n.distance:
good.append([m])
#対応する特徴点同士を描画する
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags = 2)
#画像表示
cv2.imshow('img',img3)
#画像保存
cv2.imwrite('img_3.jpg',img3)
#キーを押したら終了する
cv2.waitKey(0)
cv2.destroyAllWindows()
参考