前提・実現したいこと
全ての特徴点の座標を知りたいです。
現在、特徴点を画像と同時に取得できるようにはできていると思います。
この後に、全ての座標をグラフ上にプロット出来るようにしたいです。
もし、可能でしたら、ご教授いただけたらと思います。
宜しくお願いいたします。
発生している問題・エラーメッセージ
特になし
該当のソースコード
python
1import numpy as np 2import cv2 3from matplotlib import pyplot as plt 4from IPython import display 5 6 7 8def imshow(img, format=".jpg", **kwargs): 9 #ndarray 配列をインラインで Notebook 上に表示する。 10 img = display.Image(out, **kwargs) 11 display.display(img) 12 13 14#画像表示 15img = cv2.imread('./D1300.jpg') 16gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 17 18#輪郭抽出 19contours, hierarchy = cv2.findContours( 20 gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE 21) 22 23# 小さい輪郭は誤検出として削除する 24contours = list(filter(lambda x: cv2.contourArea(x) > 200, contours)) 25#空の輪郭画像作成 26height, width, _ = img.shape 27dest = np.zeros((height, width, 3), np.uint8) 28# 輪郭を描画する。 29cv2.drawContours(dest, contours, -1, color=(0, 0, 255), thickness=2) 30 31# 特徴検出 32detector = cv2.ORB_create() 33keypoints = detector.detect(dest) 34 35# 画像への特徴点の書き込み 36out = cv2.drawKeypoints(dest, keypoints, None) 37 38 39#plt.show() 40cv2.imwrite('./outputimage_1300.jpg',out)
> 全ての座標をグラフ上にプロット
とは、画像に重ねて表示させるのではなく、(画像無しで)普通の2次元グラフにドット表示させる、という意味でしょうか?
分かりにくくてすみません、、
その通りです!
> 全ての特徴点の座標を知りたい
keypoints = detector.detect(dest)
のすぐ下に
for i in range(len(keypoints)):
print(keypoints[i].pt)
を追加(2行目はインデントを付ける)して実行してみてください
そうしたら、全ての特徴点の座標がずらーーーっと表示されますよね
それから分かるように、「keypoints[数字].pt」で座標が取り出せるので、それら座標をmatplotlibとか使って2次元グラフに表示させてください
・数字:0, 1...特徴点の総数-1 の整数
・特徴点の総数:len(keypoints)
参考
https://wonderfuru.com/opencv%E3%81%A7%E7%94%BB%E5%83%8F%E3%83%9E%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0%E3%82%92%E3%81%99%E3%82%8B/
の「マッチングポイントを確認する」の「keypointオブジェクトは以下の属性を持っています。」と書かれてるところ
回答2件
あなたの回答
tips
プレビュー