teratail header banner
teratail header banner
質問するログイン新規登録
OpenCV

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

Python

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

Q&A

1回答

1769閲覧

[opencv] 輪郭から曲線の検出

Sakanachan

総合スコア1

OpenCV

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

Python

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

0グッド

0クリップ

投稿2022/12/18 05:13

0

0

目標:以下のような円柱から表面の模様(輪郭)を読み取り、上面の楕円形の曲線と同じ形のの輪郭を見つけ出し、そのY座標を求める。

汚い画像で申し訳ないですが、赤で囲った範囲が求めたい曲線、矢印でつながっている先が、円柱の上面にあたる楕円形です。
これは斜め上から円柱を見下ろしたイメージです。
白い線は円柱表面の模様の輪郭線で、赤で囲った曲線以外は不要になります。
上面の楕円形の形は把握できています。

イメージ説明

まず、解決法として思いついたのは、np.count_nonzeroでY座標の0からimg.shape[0]まで順に、横に並んだ白ピクセル数をカウントしていき、一定数以上の値を持ったY座標ものを選ぶといったものです。
ですが、この方法だと湾曲の大きい曲線だと上手く検知することができません。

もう一つの方法は、求めたい曲線の式を2次関数で求め、その式から横1列の(x,y)座標を求め、その座標を上から下にずらしていき、上と同じようにnp.count_nonzeroで座標の白ピクセルをカウントしていくといった方法です。

例えば、曲線の式が y = ax**2 + bx + c だとすると、画像[height]の1列においてx(0~width)を代入することで、曲線の点群が求まります。
その各点から白ピクセルの数を数えるといったものです。
その後、点群にy+-=1して上下にずらすことで、それぞれの高さのピクセル数も求まります。

しかし、どちらも良い方法には思えないので、何か良い解決法がありましたらご教授いただけると幸いです。
宜しくお願いいたします。

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

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

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

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

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

meg_

2022/12/18 07:52

質問タイトルおよび質問タグに「opencv」とありますが、本文を読むとご自身で計算方法を模索されているようです。opencvはどう関係しているのでしょうか?
Sakanachan

2022/12/18 08:38

例の画像はわかりやすいようにペイントで描いたものですが、実際は円柱型オブジェクトの写真を読み込んで輪郭を抽出したものになります。
meg_

2022/12/18 09:12

すみせん。まだopencvがどう関係しているのか分かりません。写真を読み込む処理に使用しているということでしょうか?可能であればコードで示していただけると回答がつきやすくなるかと思います。
fana

2022/12/20 04:17 編集

実際問題,何ができていて,何ができていないのか? を明確にする必要があるのではないでしょうか? 「××すればいいよね」という話があったとしても「そのためには前提として〇〇できることが必要」だったりすると思うので. (この場合,〇〇ができないならば,その先の××の話をしてても仕方ない) 例えば… > 実際は円柱型オブジェクトの写真を読み込んで輪郭を抽出したものになります。 とのことですが,実画像に対しての処理はどこまでできているのでしょう? 図の白線部分みたいな線群を個別に得るところまでは問題なくできているのでしょうか? そこまでできているならば「得られている線群を個別に評価すればよい」という方向の話にもなり得そうですが,実際問題として「1本たるべきところがブツ切りにばらけてしまう」とか「逆に複数本たるべき物が1つに繋がってしまっている」みたいな状態で止まっているようだと,そういう話もできませんよね.
guest

回答1

0

上面の楕円形の形は把握できています。
楕円形の下半分をくりぬいた画像を用意して、あとは画像のマッチングをすればできますね。
楕円形がどれだけ愚直に対象の画素と一致するかで手法が変わってきます。
ガチガチにほぼノイズなしで一致するのであればSADやSSD、NCC、ZNCCといったパターンマッチングが使えそうですし、ちょっとノイズが加わるのであれば、SIFTやAKAZEで特徴量を出して出てきた特徴点に対してBRUTEFOCEアタックをするかFLANNでマッチングをすればよいです。

少し調べればNumpyやOpenCVで実装できる(これらを使う上で重要な関数は既に標準品として実装されている)ことが分かるはずです。


これでもわからん!というのであれば、できたところまでソースコード化してください。
Sakanachanさんのソースコード(≒ガッツと根性)に応じてコメントします。

投稿2022/12/18 09:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fana

2022/12/20 01:41 編集

> 画像のマッチング 円柱を斜め上から見てる場合,底面側にいくほどカメラから遠くなる分,長径(左右方向の幅)は短くなって,形状は円形に近づく感じ…かな?) …みたいな話が,マッチング処理に言うほど影響が出るのか出ないのかはわかりませんが,何か気になったのでコメントとして書いておきます. (上面と底面のカーブを取り出せれば,中間は補間できるのかも)
退会済みユーザー

退会済みユーザー

2022/12/20 13:19

> 円柱を斜め上から見てる場合,底面側にいくほどカメラから遠くなる分,長径(左右方向の幅)は短くなって,形状は円形に近づく感じ…かな?) ガッツリこういうことが起きそうです。テレセントリックレンズであれば回避できますが、値段が跳ね上がりますねね💦 FLANNやBruteForceのマッチングであれば「画像を無理やりひしゃげさせて」マッチングするので、多少の変形であれば耐えてくれそうです(が、同時にマッチング不良の可能性もアップするおまけつきです。特徴が少ない画像だと歯が立たない可能性すらあります)
fana

2022/12/22 04:58

> 上面と底面のカーブを取り出せれば 仮にこれができるなら,円筒側面の領域に関して「円筒を真横から見たとき」のような絵に変形できそうな気もするな(気がするだけ). そしたら探したい対象は方向が既知の直線になるから話が簡単になるかも.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問