質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2969閲覧

特徴点の座標を表示して、座標をプロットしたい

pepe11

総合スコア3

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/29 17:24

編集2021/11/29 17:26

前提・実現したいこと

全ての特徴点の座標を知りたいです。

現在、特徴点を画像と同時に取得できるようにはできていると思います。
この後に、全ての座標をグラフ上にプロット出来るようにしたいです。

もし、可能でしたら、ご教授いただけたらと思います。
宜しくお願いいたします。

<画像>
イメージ説明

発生している問題・エラーメッセージ

特になし

該当のソースコード

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/11/30 23:21 編集

> 全ての座標をグラフ上にプロット とは、画像に重ねて表示させるのではなく、(画像無しで)普通の2次元グラフにドット表示させる、という意味でしょうか?
pepe11

2021/11/30 23:44

分かりにくくてすみません、、 その通りです!
jbpb0

2021/12/01 01:20 編集

> 全ての特徴点の座標を知りたい 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オブジェクトは以下の属性を持っています。」と書かれてるところ
guest

回答2

0

こういったことでしょうか?

import matplotlib.pyplot as plt x = [k.pt[0] for k in keypoints] y = [k.pt[1] for k in keypoints] # print(x) # print(y) fig = plt.figure() plt.scatter(x, y) plt.xlabel('x') plt.ylabel('y') plt.axis([0, 512, 512, 0]) #画像サイズに合わせて表示 plt.savefig("plot.png", dpi=300) plt.show()

出力結果

出力結果

投稿2021/12/02 08:52

編集2021/12/02 23:28
taront

総合スコア59

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/12/02 09:11 編集

画像の向きに合わせてY軸の上下を反転させたら、よりいいかも
taront

2021/12/02 23:28

そうですね。修正しておきました。
guest

0

ベストアンサー

全ての特徴点の座標を知りたい

python

1keypoints = detector.detect(dest)

のすぐ下に

python

1for i in range(len(keypoints)): 2 print(keypoints[i].pt)

を追加して実行してみてください
そうしたら、全ての特徴点の座標がずらーーーっと表示されますよね

それから分かるように、「keypoints[数字].pt」で座標が取り出せるので、それら座標をmatplotlibとか使って2次元グラフに表示させてください
・数字:0, 1...特徴点の総数-1 の整数
・特徴点の総数:len(keypoints)

参考
OpenCVで画像マッチングをする の「マッチングポイントを確認する」
の「keypointオブジェクトは以下の属性を持っています。」と書かれてるところ

投稿2021/12/02 07:57

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問