opencvを利用し、麻雀牌の認識プログラムを作ろうと思っています。その途中で疑問があるのでご教授お願いします。
画像を取り込み、輪郭を検出したのですがその輪郭1つ1つを切り取る方法はありますでしょうか。
調べたところ輪郭処理(cvFindContours)を使ったラベリング処理によるとh_nextというものを使えば良いようなのですが具体的な関数、コードの描き方がわかりません。
よろしくお願いします。
言語はCを使用しています。
・OS、コンパイラの情報
windows 7
visual studio express 2013 for windows desktop
・opecvのビルド方法
nugetよりopencv 2.4.10を入れました。
*8/12追記
issei.さんのご指導通り輪郭の情報を含んでいるものがポインタでくっついているものということは理解しました。
多くの輪郭が含まれているうち1つだけを抜き出す方法はどうすればよいのでしょうか?
たとえば1つだけ描こうとして
c
1cvDrawContours(result, find_contour->h_next, CV_RGB(255, 0, 0), CV_RGB(255, 0, 0), 1, 2, 8, cvPoint(0, 0));
としても1つ目の輪郭を除いたほかの輪郭すべてが描かれてしまいます。
C
1#include <opencv2/opencv.hpp> 2using namespace cv; 3 4int main(int argc, char *argv[]) 5{ 6 IplImage *im = cvLoadImage("pic.png"); //画像のよみこみ 7 IplImage *gray; //グレー化画像 8 IplImage *second; //2値化画像 9 IplImage *edge; //エッジ化画像 10 IplImage *contourim; //輪郭画像 11 IplImage *result; 12 //IplImage *result2; 13 14 gray = cvCreateImage(cvGetSize(im), IPL_DEPTH_8U, 1); 15 second = cvCreateImage(cvGetSize(im), IPL_DEPTH_8U, 1); 16 edge = cvCreateImage(cvGetSize(im), IPL_DEPTH_8U, 1); 17 contourim = cvCreateImage(cvGetSize(im), IPL_DEPTH_8U, 1); 18 result = cvCreateImage(cvGetSize(im), IPL_DEPTH_8U, 1); 19 //result2 = cvCreateImage(cvGetSize(im), IPL_DEPTH_8U, 1); 20 21 cvCvtColor(im, gray, CV_BGR2GRAY); //グレー化処理 22 cvThreshold(gray, second, 200, 250, CV_THRESH_BINARY); //2値化処理 23 cvLaplace(second, edge, 3); //エッジ化処理 24 25 //輪郭検出 26 CvMemStorage *storage = cvCreateMemStorage(0); 27 CvSeq *find_contour = NULL; 28 cvFindContours(second, storage, &find_contour, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
回答1件
あなたの回答
tips
プレビュー