
ゆうき
こんにちは、学生エンジニアのゆうき(@engieerblog_Yu)です。

ゆうき
本日はOpenCVあたりを触っていて面白かったAKAZEについて紹介したいと思います〜。
今回は下記のサイトを参考にさせていただきました。

OpenCVにより特徴点を100個プロットしたものが上記の画像です。
今回は画像を回転・縮小しても、ちゃんと特徴点を一致させることができるのかということについて検証しました。
以下コーディング部分です。
コーディング部分
環境はGoogle colaboratoryです。
import cv2
#JupyterならimportしなくてOK
from google.colab.patches import cv2_imshow
#画像の読み込み
img1 = cv2.imread("woman.jpeg")
img2 = cv2.imread("woman.jpeg")
#img2のみ回転縮小していく
#画像のリサイズ
img2 = cv2.resize(img2,(300,280))
#高さを定義
height = img2.shape[0]
#幅を定義
width = img2.shape[1]
#回転の中心を指定
center = (int(width/2), int(height/2))
#回転角を指定
angle = 45.0
#スケールを指定
scale = 1.0
#getRotationMatrix2D関数を使用
trans = cv2.getRotationMatrix2D(center, angle , scale)
#アフィン変換(45°反時計回りに回転)
img2 = cv2.warpAffine(img2, trans, (width,height))
#AKAZE検出器の作成
akaze = cv2.AKAZE_create()
#特徴点を検出
kp1,des1 = akaze.detectAndCompute(img1,None)
kp2,des2 = akaze.detectAndCompute(img2,None)
# BFMatcherオブジェクトの生成
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# Match descriptorsを生成
matches = bf.match(des1,des2)
#特徴点を似ている順にソートする
matches = sorted(matches, key = lambda x:x.distance)
# 検出結果の描画
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:30], None, flags = cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2_imshow(img3)
今回は特徴点の中で重要度が高い順に並び替えて、30個抜き出しました。
今回制作物できたもの
元画像を回転・縮小させた画像と特徴点が大まかに一致していることがわかります。

類似している特徴点の座標表示
特徴点の座標は以下のコードで表示することができます。
#1個目の画像の特徴点が配列になったもの
img1_pt = [list(map(int, kp1[m.queryIdx].pt)) for m in matches]
#2個目の画像の特徴点が配列になったもの
img2_pt = [list(map(int, kp2[m.trainIdx].pt)) for m in matches]
#1個目の類似しているとみなされた特徴点を配列で書き出す
print(img1_pt)
#2個目の類似しているとみなされた特徴点を配列で書き出す
print(img2_pt)
output(1個目の画像の特徴点):


ゆうき
ご覧いただきありがとうございました。

ねこすけ
他にもいろんな記事を投稿してるにゃ。
その他の記事
ChatGPTおすすめ拡張機能
noteで、ChatGPTのおすすめChrom拡張機能5つと収益化方法について解説しています。
noteでは、以下について解説しています。
Googleスプレッドシートやドキュメントの自動入力
ツイートの自動返信
Youtube動画の自動要約
Gmailの自動返信
検索画面にChatGPTの結果表示
AI美女生成に興味がある方
Stable Diffusionを使ってAI美女を生成する方法についてもnoteで解説しています。

コメント