画像の角を表示する
◉角(コーナー)を使う
濃度の違いから「角のような」位置を見つけ「特徴点」とする方法。
ここでいう、角とは、大まかにいうと、
「縦と横が交わる所で、周りよりも明るい部分、または濃い部分がある所」。
コンピュータがこの角を見つけることで、
比較する情報が定まり、効率的に「一致」か「近い」かを判断することができる。
◉画像から角(コーナー)を見つける方法
cv2.goodFeaturesToTorack(画像, 角の最大数, 品質レベル, 2つのコーナー間の距離)
⚫︎画像:コーナーを表示したい画像
⚫︎角の最大数:見つけたいコーナーの最大数
⚫︎品質レベル:採用するコーナーのしつの最低基準(0〜1で指定)
⚫︎2つのコーナー間の距離:コーナー間の直線距離
<画像から角(コーナー)を抽出するPythonコード例>
import sys
import cv2
if len(sys.argv)<2:
print('表示したいファイル名を指定してください。')
sys.exit()
file = sys.argv[1]
try:
img = cv2.imread( ' file ' )
if img is None:
raise ValueError('ファイルが見つかりません')
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
MAX_CORNERS = 80
QUALITY_LEVEL = 0.01
MIN_DISTANCE = 5.0
corners = cv2.googFeaturesToTrack(img_gray, MAX_CORNERS, QUALITY_LEVEL, MIN_DISTANCE)
for corner_info in corners:
corner_x, corner_y = corner_info.ravel()
cv2.circle(img, (corner_x, corner_y), 1, (0, 200, 255), -1)
cv2.circle(img, (coner_x, corner_y), 8, (0, 200, 255))
cv2.imshow(file, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
except ValueError as e:
print(e)
except:
import traceback
traceback.print_exc()
◉まとめ
輪郭にも得意分野があることを覚えておくとよい。
ラプラシアン エッジから大まかな形を
ソーベル 縦横のエッジを
キャニー エッジが見つけにくい場合に
コーナー 特徴点の数や集まり具合から内容を推測する場合に