三角形の抽出方法についてのヒントを教えてください。

このQ&Aのポイント
  • Visual Studio2005 + C言語でプログラムを書いています。不定形の画像20枚から、青い太線の三角形を抽出し、正解の三角形との近似率を取得したいです。
  • OpenCVのMatchShapes関数を使用して、正解の三角形と他の三角形の近似率を計算することはできましたが、画像中の全ての三角形を抽出する方法がわかりません。
  • 三角形の抽出方法について何かヒントやアドバイスがあれば教えてください。
回答を見る
  • ベストアンサー

三角形をひとつずつ抽出するには

Visual Studio2005 + C言語でプログラムを書いています。 不定形の画像20枚に、サイズ、位置、角度が様々な三角形が一部重なって描かれています。 画像に背景はありません、三角形は必ず青い太線です。 20枚の画像からひとつずつ三角形を取りだし、「正解の三角形」との近似率を取得したいのですが どのような方法で三角形を順次抽出できるでしょうか。 「正解の三角形」と、いろいろな三角形の近似率は、OpenCVのMatchShapes関数で実現できましたので、その前の手順の「画像中の全ての三角形の抽出」もOpenCVで実現できないかと思ったのですが どうもうまくいかず困っています。 もし何かヒントでもご存知でしたらぜひ教えてください。 どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.3

ピークが分かれば線分の方程式がわかるし、方程式が分かれば三角形の頂点がわかります。 学習だとか大層な仕組みは必要ないでしょう。 私はOpenCvだとか他人が作った仕組みには興味がないので、関数といわれも全く知りません。あしからず。

rosafilipes
質問者

お礼

ありがとうございました。 なるほど、とてもわかりやすくイメージが湧きました。 3つのピークをつなぐ式が直線の方程式であれば三角形、と理解し調べています。 すると、これは三角形以外でも、いろいろな図形に応用できるでしょうか。 五角形、八角形、などなど。。。これは別スレッドにします。 ありがとうございました!大変助かりました!!!

その他の回答 (2)

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.2

Hough変換の考え方が正しくないようです。 Hough変換は今回の例題に沿って言うと、線分は幅1ドットだと想像していますが、画像中のすべての黒ドットにたいしてHough変換を行います。その際にそのドットが線分の一部かどうかは一切関係がありません。ゴミのようなドットが有っても関係なしに行います。 変換後のデータを調べると、今回は三角形ですからピークが3か所あるはずです。その3か所のピークが三辺に対応しています。 つまり、Hough変換は自分で直線を探すというよりも自動的に見つかるという感じです。印を付ける必要はないと思いますが。

rosafilipes
質問者

お礼

hashioogiさん、書き込みありがとうございます。 hough関数を理解できていませんでした、すみません。 「ピークが三か所」というのが三角形の特徴量で、 その特徴が見つかったら「一定の距離や角度にピークがあれば三角形」と 判定する、ということでしょうか。 その「見つけたピークからの一定の距離や角度」をパターン学習するべきだろうか、と思い調べましたがOpenCVならFeatureEvaluator関数でできるのだろうか・・・と見当をつけているところです(サンプルコードがないので現時点試していません)、OpenCVから離れ、基本的に画像処理で、通常こうした処理で使われている関数などあれば教えていただけませんでしょうか。 いろいろと伺ってしまいすみません。 どうぞ宜しくお願い致します。

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.1

Hough変換かなと思いますけど。

rosafilipes
質問者

お礼

ありがとうございます。 調べたのですが、 Hough関数で直線を探して、見つかれば三角形を当ててみて三角であれば(特徴量が合致すれば)抽出し、 一度探した直線には「もう検査済」の印をつけて、 何度も同じ線を走査しないようにする、 というイメージで大体、ハズレていないでしょうか。 しかし自分でいっておいて情けないのですが、一度探した直線に「もう検査済」と印をつけるって、どうすれば実現できるのでしょうか。。 もしおわかりでしたらぜひ何か教えてください。 どうぞよろしくお願い致します。

関連するQ&A

  • matlabの変数をVisual Studioで

    matlabで計算を行い, その変数の値をVisual Studioで製作したプロジェクトで受け取るようなことをしたいのですが、そのような機能ややり方があったら教えてください. 使用しているソフトウェア matlab2015b visual studio 2012 opencv3.0.0 使用する言語 C++ OS Windows10

  • C言語での平滑化フィルタ

    OPenCVを使わずにC言語で3×3の平滑化フィルタを作成したと思っています。 それで、プログラム例を参考にして作ろうと、googleなどで検索しているのですけれども、なかなかファイルの読み込みから平滑化処理まで全てを書いてくれているプログラム例が見つかりません。 もしご存知の方がいらしたら、コンパイル可能な状態のプログラム例を教えて頂けないでしょうか? 環境はwindows VISTAでVisual Studio2008を使っています。 画像サイズなどはこだわりません。

  • タイピングゲームの作り方

    タイピングゲームを作りたいと思うのですが, どのような言語を勉強すればよいでしょうか。 できれば詳しくC言語の何々というように教えてもらいたいのですが。 ソフトのほうはVisual Studioがあるので その中にあるソフトから選びたいのですが。 画像に関しては結構です。 今のところ,Visual Basicに一番なじみが深いので Visual Basicで作れると一番いいのですが。 よろしくお願いします。

  • 画像処理(高精度な輪郭検出)について

    今年新卒で入社し、医療機器関連のエンジニアとしてスタートしたものです。素人ながら質問させていただきたいと思います。 現在、Visual Studio 2010(言語はC#)とOpenCVを用いて、画像中の輪郭、物体をできるだけ高精度に検出するアルゴリズムの研究を行っています。 基本である差分計算やOpenCVの関数を用いたラプラシアンフィルタやCannyアルゴリズム、輪郭線抽出、RGBからHSV,Lab色空間(Labについては現在も調査中です。)へ変換し、閾値を変えてみるなど試してみました。また、PhotoShopを用いて、コントラストや明るさ、色調変換をかけて、同様に試してみたりもしました。 しかし、画像によっては満足いく輪郭、物体の検出ができない状態です(フリーソフトの輪郭検出器2.10を使ってみても同じでした)。勿論、明るさやレンズの特質等の影響もあるとは思いますが・・・。 そこでお聞きしたいのですが、上記の他にもできるだけ高精度に輪郭や特徴点を検出する手法がありましたら、教えていただける範囲で教えていただけないしょうか。 漠然とした質問で申し訳ありません。どうぞよろしくお願い申し上げます。 今のところ検討中なのは、対象画像に何らかのフィルタをかけて、それから差分や大津の2値化閾値判定を使う、特徴点抽出には、OpenCVのコーナー検出アルゴリズム(Harris等)やSURF等を使うことを考えています。 勿論、上記の事項に応用的に工夫を加える独自のアルゴリズムも検討中です。

  • Visual Studio 2008コマンドプロンプトのinclude

    Visual Studio 2008コマンドプロンプトのincludeファイルのパス設定について、教えてください。 C言語で書かれたOpencvのサンプルコード「ヒストグラムの描画」を実行するとエラーが出ます。 http://opencv.jp/sample/histogram.html#hist 「fatal error C1083: includeファイルを開けません。'cv.h':No such file or directory.」 画像を表示する、という別のコードはVisual Studioで実行できましたので、Visual Studioの環境設定は正常ではないかと思います。 環境変数のパスの設定や(マイコンピュータ→システムのプロパティ→詳細→環境変数)、Visual Studioでのライブラリやインクルードファイルの設定も完了しており(ツール→オプション→プロジェクトおよびソリューション)、Visual Studio 2008のIDE環境でビルトすると、別のサンプルコードは実行できました。このふたつめのサンプルコードは一瞬コマンド画面が表示されて、何も結果が出ずに消えてしまいます。 なぜでしょうか? D/Lし直したり、設定しなおしましたが、事象は変わらずとても困っています。 もし何かお心当たりがあればぜひ教えてください。 どうぞ宜しくお願い致します。

  • CSSで背景画像に指定されている画像を抽出して、グレースケールに変換っ

    CSSで背景画像に指定されている画像を抽出して、グレースケールに変換って可能でしょうか?できれば、JavaScriptで行いたいのですが、もし、グレースケールに変換方法をご存知の方がいればご教授いただけないでしょうか? また、JavaScriptで無理ならば、どの言語ならば可能かも教えていただければ幸いです。知識が無くて誠に申し訳ございません。

  • ノイズ処理の原理

    カラー画像からある色の抽出を行うに当たって、ノイズ処理を行うことになり、ネットで検索をし処理方法を見つけてきました。 環境はVC++上でOpenCVというC言語のライブラリーを使用しています。 処理方法は、openCVの関数を使用し cvPyrDown( imgA, imgB, 7 ); // 7 ピクセル縮小 cvPyrUp( imgB, imagA, 7 ); // 7 ピクセル拡大 といった 前画像に対して、7ピクセル縮小処理を行い、結果画像に対して7ピクセル拡大することによって、ぼやけた感じの画像が完成し、色抽出がうまくできました。 しかし、何故この方法でうまく出来たのかの原理がいまいち分からずすっきりしていません。 よろしければ、誰か理由を教えていただけないでしょうか??

  • OpenCVを使いたいのですが

    Visual C++ 2010にOpenCV2.4.3の導入し、設定を終えたのでプログラムをビルドさせるとエラーが吐き出され動作しません。 どなたか原因がわかる方はいらっしゃらないでしょうか? 【プログラム】 #include<stdio.h> #include<openCV2/opencv.hpp> #ifdef _DEBUG #pragma comment(lib,"opencv_core243d.lib") #pragma comment(lib,"opencv_highgui243d.lib") #pragma comment(lib,"opencv_objdetect243d.lib") #else #pragma comment(lib,"opencv_core243d.lib") #pragma comment(lib,"opencv_highgui243d.lib") #pragma comment(lib,"opencv_objdetect243d.lib") #endif //-------------------------------------------------------- //main int main(int argc,char* argv[]) { const char* szWndName="画像"; if(argc<2) { fprintf(stderr,"入力ファイル名を指定してください。\n"); return -1; } IplImage *img=cvLoadImage(argv[1],CV_LOAD_IMAGE_COLOR); if(img==NULL) return -1; cvNamedWindow(szWndName); cvShowImage(szWndName, img); cvWaitKey(0); cvDestroyAllWindows(); cvReleaseImage(&img); return 0; } 【ビルド後にでるエラーメッセージ】 ------ すべてのリビルド開始: プロジェクト: OpenCV, 構成: Debug Win32 ------ TEST02.c C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(19): error C2054: 'using' の後に '(' が必要です。 C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(19): error C2061: 構文エラー : 識別子 'using' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(19): error C2054: 'using' の後に '(' が必要です。 C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(21): error C2061: 構文エラー : 識別子 'using' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(21): error C2061: 構文エラー : 識別子 'abs' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(21): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(21): error C2061: 構文エラー : 識別子 'atexit' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(21): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2061: 構文エラー : 識別子 'atof' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2061: 構文エラー : 識別子 'atoi' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2061: 構文エラー : 識別子 'atol' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2061: 構文エラー : 識別子 'bsearch' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2061: 構文エラー : 識別子 'calloc' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2061: 構文エラー : 識別子 'div' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2061: 構文エラー : 識別子 'exit' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2061: 構文エラー : 識別子 'free' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2061: 構文エラー : 識別子 'getenv' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(25): error C2061: 構文エラー : 識別子 'labs' この後はエラー表記が続きます。

  • wiiyourselfをフォームアプリケーションに

    Wiiyourself1.15をダウンロードして、Demoプログラムはなんとか動作させることができました。 wiiyourself! : http://wiiyourself.gl.tter.org/ そこで、Wiiリモコンの角度の値によって、画像を変えるようなプログラムを作成したいのですが、 どのように改変すればそのようなものが作成できるのでしょうか? Wiiリモコンの角度の値なども一緒に表示させたいです。 フォームアプリケーションでピクチャーボックスを使おうかと考えましたが、 どのように移植すればいいのかすらわかりません;; 開発環境はVisual Studio 2008 VC++です。 Visual Studio自体初心者で勉強が足りないのが重々承知していますが、 どなたかわかる方がいましたら、回答お願いします。

  • c++のプログラミングにて

    青い背景にボールが映っている画像があります HSB値に対する閾値処理を行いボールだけを抽出したいのですが プログラミング素人の自分には全くわかりません サンプルプログラムやヒントなどをどうかお願いします