OpenCVのcvFindContours関数を使って取り出した輪郭を処理をする方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Arare

OpenCVのcvFindContours関数を使って取り出した輪郭を処理をする方法

#1

投稿記事 by Arare » 12年前

OpenCVでcvFindContours関数を使って取り出した輪郭をROIに指定して処理をする方法を教えてください

OpenCVでcvFindContours関数を使って取り出した輪郭をROIに指定してその中を白くしたいです

このようなプログラムでOpenCVで画像を二値化して、輪郭を赤く囲うことはできているのですが、その輪郭をROIに指定する方法がわかりません
方法を教えてください

環境は、Windows7,Visual C++ 2010 Expressです

yahoo!知恵袋とのマルチポストとなっています
http://detail.chiebukuro.yahoo.co.jp/qa ... 4116186524

コードが改行できなてないです。なぜ改行できないのかも教えていただけると幸いです

コード:


#include "stdafx.h"
#include <opencv2/opencv.hpp>
#pragma comment(lib,"opencv_imgproc242d.lib")
#pragma comment(lib,"opencv_core242d.lib")
#pragma comment(lib,"opencv_highgui242d.lib")

int _tmain(int argc, _TCHAR* argv[])
{
	IplImage *Image,*img_gray;
	CvSeq *Contour;
	CvMemStorage *Storage=cvCreateMemStorage (0);
	CvScalar ContoursColor;
	ContoursColor=CV_RGB( 255, 0, 0 );
	cvNamedWindow("枠組み条約",CV_WINDOW_AUTOSIZE);
	Image=cvLoadImage("blog202_1.png");
	img_gray=cvCreateImage(cvGetSize(Image),IPL_DEPTH_8U,1);
	cvCvtColor(Image,img_gray,CV_BGR2GRAY);
	cvThreshold(img_gray,img_gray,100,255,CV_THRESH_BINARY);
	cvFindContours(img_gray,Storage,&Contour,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
	cvDrawContours(Image, Contour,ContoursColor, ContoursColor, 0, 2);
	if (Contour->h_next != NULL){cvDrawContours(Image, Contour->h_next,ContoursColor, ContoursColor, 0, 2);}
	cvShowImage("枠組み条約",Image);
	cvWaitKey(0);
	cvDestroyWindow("枠組み条約");
	cvReleaseImage(&Image);
	cvReleaseMemStorage (&Storage);

	return 0;
}


アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: OpenCVのcvFindContours関数を使って取り出した輪郭を処理をする方法

#2

投稿記事 by みけCAT » 12年前

Arare さんが書きました:コードが改行できなてないです。なぜ改行できないのかも教えていただけると幸いです
おそらくIEのバグです。
Firefoxなど、IE以外のブラウザを使用するといいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: OpenCVのcvFindContours関数を使って取り出した輪郭を処理をする方法

#3

投稿記事 by みけCAT » 12年前

Arare さんが書きました:yahoo!知恵袋とのマルチポストとなっています
yahoo!知恵袋側にこちらへのリンクが見当たりません。
「相互」リンクをお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Arare

Re: OpenCVのcvFindContours関数を使って取り出した輪郭を処理をする方法

#4

投稿記事 by Arare » 12年前

申し訳ないです!
リンク貼っておきました!

アバター
usao
記事: 1892
登録日時: 13年前
連絡を取る:

Re: OpenCVのcvFindContours関数を使って取り出した輪郭を処理をする方法

#5

投稿記事 by usao » 12年前

まず,cvSetImageROI()によるROI指定 ということであれば,(傾いていない : X軸,Y軸に辺が平行な)矩形領域しか扱えないはずです.
なので,一般的な輪郭形状をROIとして用いることはできません.

で,リンク先の絵をみたところ,どうやら輪郭は矩形っぽいので,
その状態なのであれば,輪郭形状を取得して一度矩形データに直せば良いかと思います.

cvFindContour()の結果から,輪郭の頂点群座標を得る方法は
「cvApproxPoly cvFindContour CV_GET_SEQ_ELEM」 とかで検索すると見つかると思います.
オフトピック
効率とかを気にしなくてよいのであれば,
最悪,cvDrawContours()で描画してもらった結果を走査して…みたいな方法も?

Arare

Re: OpenCVのcvFindContours関数を使って取り出した輪郭を処理をする方法

#6

投稿記事 by Arare » 12年前

申し訳ないのですが
今現在使用している画像以外にも例えば〇型のものでも同じ方法をやりたいと考えています
なのでROI以外の方法で、特定した輪郭内のものを白で表示させる方法を教えてください

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: OpenCVのcvFindContours関数を使って取り出した輪郭を処理をする方法

#7

投稿記事 by みけCAT » 12年前

適当にググって出てきたサイトです。
http://imagingsolution.blog107.fc2.com/ ... y-202.html
輪郭は
  cvDrawContours( img, Contour, ContoursColor, ContoursColor, 0, 2);
のように線幅2で描画していますが、これを
  cvDrawContours( img, Contour, ContoursColor, ContoursColor, 0, CV_FILLED);
とすると輪郭の内側が塗りつぶされます。
※未検証です
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Arare

Re: OpenCVのcvFindContours関数を使って取り出した輪郭を処理をする方法

#8

投稿記事 by Arare » 12年前

申し訳ありません

質問がすこし誤解を招く内容だったのですこし補足させて頂きます

最終的にはカメラから得た映像から物体を検出し、それをよけたいと思っています

そのために、まず画像を二値化して、そこから輪郭をとらえ、そこに物体があるということを知りたいと思っています

そのために、そこの輪郭内に色を付けようと考えてましたが

そこのピクセル?の座標を認識してよけられればいいと考えています

質問がわかりにくく申し訳ございませんでした

Arare

Re: OpenCVのcvFindContours関数を使って取り出した輪郭を処理をする方法

#9

投稿記事 by Arare » 12年前

cvDrawContours( img, Contour, ContoursColor, ContoursColor, 0, CV_FILLED);

これを使ったら見事出来ました!

ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る