2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AKAZEで特徴量抽出

Last updated at Posted at 2022-04-13

最終的にやりたいこと

背景の同じでない2つの画像の差分を取る

今回やったこと

参考をもとに2枚の画像から特徴量を抽出してマッチングを行った

使ったもの

元々はopencvのチュートリアルのにあるコードを動かそうと思っっていたが著作権の関係でSHIFTを使うことができなかったので同様の処理を行えるかつより強力なAKAZEを用いた.

今回使用した2枚の写真は以下
image_1.png
image_2.png

結果

img_3.jpg

感想と今後の予定

特徴量の抽出からマッチングまできちんとできたがやはり植物といった自然のものよりも人工物に特徴があるんだなと思った
次は特徴をもとに位置合わせを行って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()

 

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?