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

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

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

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

Python

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

Q&A

解決済

2回答

13827閲覧

opencv python 輪郭の特徴点の座標

reonald

総合スコア32

OpenCV

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

Python

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

0グッド

0クリップ

投稿2019/11/25 05:56

編集2019/11/25 07:22

輪郭抽出した後に,特徴点の座標が知りたいです。

import

1import matplotlib.pyplot as plt 2from matplotlib.patches import Polygon 3 4img = cv2.imread("./pu1/1124_2_0.jpg") 5gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 6ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) 7 8kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) 9binary = cv2.dilate(binary, kernel) 10contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 11 12def draw_contours(ax, img, contours): 13 ax.imshow(img) 14 ax.set_axis_off() 15 16 for i, cnt in enumerate(contours): 17 if cv2.contourArea(cnt) < 1900: 18 continue 19 else : 20 cnt = cnt.squeeze(axis=1) 21 ax.add_patch(Polygon(cnt, color="b", fill=None, lw=2)) 22 ax.plot(cnt[:, 0], cnt[:, 1], "ro", mew=0, ms=4) 23 ax.text(cnt[0][0], cnt[0][1], i, color="orange", size="20") 24 print(contours) 25 26 27fig, ax = plt.subplots(figsize=(8, 8)) 28draw_contours(ax, img, contours) 29 30plt.savefig('./rinnkaku/.jpg') 31コード

このコードで元画像から下のような画像が得られるのですが,
イメージ説明
イメージ説明

面積の小さな部分の輪郭の座標も抽出してしまいます。
一番大きな輪郭(ここでいう2ばん)のところだけの座標群を知りたいです。

どなたかよろしくお願いします。

pythonのversionは3.7.3で,
opencvのversionは4.1.1です。

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

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

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

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

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

tiitoi

2019/11/25 06:30

findContours の返り値 contours がそのまま求めてる座標値ではないのでしょうか?
reonald

2019/11/25 06:51

コードや質問内容を修正したので再度確認してもらえたら嬉しいです。
tiitoi

2019/11/25 07:17

輪郭が描画されていない元画像を添付していただけますか
reonald

2019/11/25 07:22

追加しました。
guest

回答2

0

ベストアンサー

一番大きな輪郭(ここでいう2ばん)のところだけの座標群を知りたいです。

cv2.contourArea() で輪郭の面積を取得できるので、この関数を max() の key 引数に指定して、面積が最大の輪郭を取得する。

target_contour = max(contours, key=lambda x: cv2.contourArea(x))

これで取得できた輪郭は (点の数, 1, 2) の numpy 配列で、これが輪郭の点を構成する座標になっています。(画像の左上が原点 (0, 0) で単位はピクセルの画像座標系)

python

1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4from matplotlib.patches import Polygon 5 6 7def draw_contours(ax, img, contours): 8 ax.imshow(img) 9 ax.set_axis_off() 10 11 for i, cnt in enumerate(contours): 12 cnt = cnt.squeeze(axis=1) 13 ax.add_patch(Polygon(cnt, color="b", fill=None, lw=2)) 14 ax.plot(cnt[:, 0], cnt[:, 1], "ro", mew=0, ms=4) 15 ax.text(cnt[0][0], cnt[0][1], i, color="orange", size="20") 16 17 18img = cv2.imread("sample.jpg") 19 20gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 21 22ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) 23 24kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) 25binary = cv2.dilate(binary, kernel) 26 27contours, hierarchy = cv2.findContours( 28 binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE 29) 30 31# 一番面積が大きい輪郭を抽出する。 32target_contour = max(contours, key=lambda x: cv2.contourArea(x)) 33 34 35fig, ax = plt.subplots(figsize=(8, 8)) 36draw_contours(ax, img, [target_contour]) 37 38# 輪郭を構成する点を CSV に保存する。 39np.savetxt( 40 "target_contour.csv", target_contour.squeeze(axis=1), delimiter=",", header="X,Y" 41)

投稿2019/11/25 07:32

tiitoi

総合スコア21956

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

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

0

1.面積の小さいところ(これなら0-7の輪郭)を輪郭抽出したくない。

contourAreaを使って面積をチェックしてはじいてみて下さい。

2.赤点の座標が知りたいです。

draw_contoursの中で座標を取得しているコードを書いているように見受けられるので、ちょっと何が分からないのかつかめないです。

投稿2019/11/25 06:25

tachikoma

総合スコア3601

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問