1.実行結果
実行してみた結果を載せてみる。とりあえず定番Lenaさん。左右反転して横にしてみたが,まぁそこそこの精度で認識できている。本当は詳しい説明などをしたいのだが,残念ながらそんな知識はないのでとりあえず公式サイト最強ということでごまかす。リンク先は英語です。
2.ソースコード
まぁコメントは大目に書いたつもりだけれど,「画像を読み込む」→「特徴量抽出」→「類似する特徴量を探す」→「類似する部分を描く」という感じ。類似する部分を描くという作業は実際に何かを作るときは必要ないのだけれども,なんかそれ専用のdrawMatches関数なるものが定義されているので使ってみた。# -*- coding: utf-8 -*-
import numpy as np
import cv2
# ORB特徴量を抽出するためのもの
orb = cv2.ORB_create()
# 画像を読み込み
img1 = cv2.imread("img1.jpg")
img2 = cv2.imread("img2.jpg")
# 各画像のキーとなる場所(keypoint)とその詳細(description)を計算
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
# 特徴量がどれだけ似ているかを調べるためのもの
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# 一致している(類似している)ものを判定
matches = bf.match(des1,des2)
# 似ている点を線で引いてくれる関数
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10],None, flags=2)
# 結果の保存
cv2.imwrite("match.jpg",img3)


