作成日
2018/09/27最終更新
2024/08/08記事区分
一般公開特徴点の検出 Feature Detection
特徴点として利用できるものの一つに、物体の角があります。角を検出するアルゴリズムの一つに Harris Corner Detection があります。分かりやすさのため、モルフォロジー変換で「角」を膨張させています。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import numpy as np
import cv2 as cv
# 画像の読み込み
img = cv.imread('aaa.png')
# グレースケール変換
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 特徴点として扱いやすい「角」を計算
dst = cv.cornerHarris(gray.astype(np.float32), 2, 3, 0.04)
# 分かりやすさのため、モルフォロジー変換で「角」を膨張させます。
dst_dilated = cv.dilate(dst, None)
# もとの画像に赤い点として描画します。
img[dst_dilated > 0.01 * dst_dilated.max()] = [0, 0, 255]
# 描画してみます。
cv.normalize(dst, dst, 0, 255, cv.NORM_MINMAX)
cv.normalize(dst_dilated, dst_dilated, 0, 255, cv.NORM_MINMAX)
cv.imshow('dst', dst.astype(np.uint8))
cv.imshow('dst_dilated', dst_dilated.astype(np.uint8))
cv.imshow('img', img)
cv.waitKey(0)
特徴点のマッチング Feature Matching
特徴点に対する特徴記述子 Feature Description を計算して、それぞれの画像で計算結果を比較してマッチングします。マッチング結果は、例えばパノラマ画像の作成などに利用できます。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import numpy as np
import cv2 as cv
# 画像を読み込みます
img1 = cv.imread('aaa.png')
img2 = cv.imread('fff.png')
# グレースケール変換
gray1 = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
gray2 = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
# ORB detector で特徴点 (keypoints) と特徴量 (descriptors) を計算します。
orb = cv.ORB_create()
kp1, des1 = orb.detectAndCompute(gray1, None)
kp2, des2 = orb.detectAndCompute(gray2, None)
# 総当たりで特徴量をマッチングします。
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
# より良くマッチした 10 の特徴点を可視化してみます。
matches = sorted(matches, key = lambda x:x.distance)
dst = cv.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=2)
cv.imshow('dst', dst)
cv.waitKey(0)
関連記事
- Python コードスニペット (条件分岐)if-elif-else sample.py #!/usr/bin/python # -*- coding: utf-8 -*- # コメント内であっても、ASCII外の文字が含まれる場合はエンコーディング情報が必須 x = 1 # 一行スタイル if x==0: print 'a' # 参考: and,or,notが使用可能 (&&,||はエラー) elif x==1: p...
- Python コードスニペット (リスト、タプル、ディクショナリ)リスト range 「0から10まで」といった範囲をリスト形式で生成します。 sample.py print range(10) # for(int i=0; i<10; ++i) ← C言語などのfor文と比較 print range(5,10) # for(int i=5; i<10; ++i) print range(5,10,2) # for(int i=5; i<10;...
- ZeroMQ (zmq) の Python サンプルコードZeroMQ を Python から利用する場合のサンプルコードを記載します。 Fixing the World To fix the world, we needed to do two things. One, to solve the general problem of "how to connect any code to any code, anywhere". Two, to wra...
- Matplotlib/SciPy/pandas/NumPy サンプルコードPython で数学的なことを試すときに利用される Matplotlib/SciPy/pandas/NumPy についてサンプルコードを記載します。 Matplotlib SciPy pandas [NumPy](https://www.numpy
- pytest の基本的な使い方pytest の基本的な使い方を記載します。 適宜参照するための公式ドキュメントページ Full pytest documentation API Reference インストール 適当なパッケージ