🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

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

Python

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

Q&A

解決済

1回答

4729閲覧

opencvを用いた輪郭抽出が出来ない

TakaKan

総合スコア10

OpenCV

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

Python

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

0グッド

1クリップ

投稿2019/10/11 11:52

編集2019/10/11 11:58

前提・実現したいこと

画像の白線を輪郭として抽出させた後それぞれが何角形であるかを調べたいと思っています。
opencvとpythonを用いて行なっているのですが輪郭がきちんと抽出されません。

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

画像のように、一部は赤線とはなっていますが内側部分は認識すらされていないように思います。 また、赤線となる場合と青線となる場合の違いが分かりません。

該当のソースコード

python

1gray = cv2.cvtColor(img_draw, cv2.COLOR_BGR2GRAY) 2contours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 3import matplotlib.pyplot as plt 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 # 形状を変更する。(NumPoints, 1, 2) -> (NumPoints, 2) 13 cnt = cnt.squeeze(axis=1) 14 # 輪郭の点同士を結ぶ線を描画する。 15 ax.add_patch(Polygon(cnt, color="b", fill=None, lw=2)) 16 # 輪郭の点を描画する。 17 ax.plot(cnt[:, 0], cnt[:, 1], "ro", mew=0, ms=4) 18 # 輪郭の番号を描画する。 19 ax.text(cnt[0][0], cnt[0][1], i, color="orange", size="20") 20 21 22fig, ax = plt.subplots(figsize=(8, 8)) 23draw_contours(ax, img, contours) 24 25plt.show()

試したこと

一通りネットや文献は確認してみたつもりですが、opencvを用いて輪郭を共有している図形の輪郭を抽出しようとしているものがほとんどなく、良い解決策が見つかっていないのが現状です。
また、cv2.findContoursのmethod部分を変えて行なったりもしましたが良い変化はありませんでした。

補足情報(FW/ツールのバージョンなど)

os:macbook
python:3.7.3
opencv:4.1.1
元画像
抽出後

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

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

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

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

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

guest

回答1

0

ベストアンサー

大前提として、「輪郭抽出」を行うので ー (直線)の領域は = (直線の両側の輪郭)という形で輪郭が抽出されますが、この点は認識していますでしょうか。

赤と青の違いについては、コードに記載してある通り「輪郭の点同士を結ぶ線」が青、「輪郭の点」が赤丸で描画されています。(コピペのコードでしょうか)
https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.plot.html#matplotlib.axes.Axes.plot
一度赤丸の描画をやめるとわかりやすくなるかと思います。

また、CV_RETR_EXTERNALは一番外側の輪郭のみ抽出する指示です。この場合はCV_RETR_LISTあたりを使って全ての輪郭をリストで取得する方法が適しているかと思います。
https://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html

今回の場合は、二重線になるのがかえって好都合かと思いますので、リストで取得した図形のそれぞれの頂点数を求めれば解決しそうです。

投稿2019/10/11 12:56

Kapustin

総合スコア1186

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

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

TakaKan

2019/10/12 05:04

お答えくださりありがとうございます! RETR_LISTに変えたら上手く出来ました。
TakaKan

2019/10/12 05:31 編集

何角形か数えるプログラムも頑張ってみようと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問