ここから本文です

VC++OpenCVでラベリングし、ラベルのおかれた座標を取り出したいです。 そこで...

このエントリーをはてなブックマークに追加

質問者

ouchi_e_kaeroさん

2010/7/3112:50:51

VC++OpenCVでラベリングし、ラベルのおかれた座標を取り出したいです。

そこで井村さんのラベリングクラスを見つけました。
http://oshiro.bpe.es.osaka-u.ac.jp/people/staff/imura/products/labe...

それを使用したいのですが、
関数に座標を呼び出すようなものがありません。

RasterSegmentというクラスの中に
座標が入っているのですが、
取り出し方がわかりません。

初歩的な質問ですが、
回答頂けると助かります。

よろしくお願いします。

補足C++やクラスについて完璧に理解できていません。

friend std :: ostream& operator<< (std :: ostream& s, RegionInfo& ri)
から取り出せるみたいなんですが、
この使い方を教えてください。

よろしくおねがいします。

閲覧数:
6,125
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

tpofofntsftさん

2010/7/3116:48:48

参考になるかわからんけど…

#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include "Labeling.h"

int main( void )
{
LabelingBS label;
LabelingBS::RegionInfo *regInfo;
LabelingBS::RSPList rspList;
LabelingBS::RasterSegment *rasSeg;
LabelingBS::RSPIterator rspIterator;
IplImage *img;
int pixCnt, i, j, nop, w, h;
float x, y;
short *dst;

cvNamedWindow( "CaptureImageSRC", CV_WINDOW_AUTOSIZE );

img = cvLoadImage( "input.bmp", 0 ); /* 画像をグレースケールで読み込み */

pixCnt = img->width*img->height;

/* 画像2値化 */
for( i=pixCnt; i--; )
img->imageData[i] = ((unsigned char)img->imageData[i]>130)? 255: 0;

dst = new short[pixCnt]; /* ラベリング結果出力領域 */

label.Exec( (unsigned char*)img->imageData, dst, img->width, img->height, true, 10 );

printf( "ラベリングされた領域の数:%d\n", label.GetNumOfRegions() );

for( i=0; i<label.GetNumOfRegions(); i++ ) {
regInfo = label.GetResultRegionInfo( i );
nop = regInfo->GetNumOfPixels(); /* 領域の面積(画素数) */
if( nop < 100 ) continue; /* 小領域は無視 */
regInfo->GetCenterOfGravity( x, y ); /* 領域の重心 */
regInfo->GetSize( w, h ); /* 領域の外接矩形サイズ */

printf( "領域重心(%f, %f) 面積 : %d(pixels) サイズ(%d, %d)\n", x, y, nop, w, h );

/* 領域の重心、面積、外接矩形サイズ程度がほしいなら以上まででOK */
/*補足から察するに、多分OK */

rspList = regInfo->GetRasterSegmentList();

if( i == 0 ) { /* 以降は、全部表示が大変だから最大領域(i==0)のみ */
for( rspIterator=rspList.begin(); rspIterator!=rspList.end(); rspIterator++ ) {
rasSeg = *rspIterator;
printf( "y = %d , x = %d から %d\n", rasSeg->GetY(), rasSeg->LeftX(), rasSeg->RightX() );
}
}
}

/* 上位3大領域を色分け */
for( i=pixCnt; i--; ) {
switch( dst[i] ) {
case 1: img->imageData[i] = 255; break;
case 2: img->imageData[i] = 175; break;
case 3: img->imageData[i] = 95; break;
default: img->imageData[i] = 0;
}
}

/* 色分け画像を表示 */
cvShowImage( "CaptureImageSRC", img );

cvWaitKey( 0 );

cvReleaseImage( &img );
delete [] dst;
cvDestroyWindow( "CaptureImageSRC" );

return 0;
}

質問した人からのコメント

2010/7/31 18:03:58

笑う ものすごく参考になります!
わかりやすいし、
ここまで詳しくプログラムを書いていただいて助かります。
これを元に組んでみようと思います。
ありがとうございした!

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル
  • このエントリーをはてなブックマークに追加

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

ID/ニックネームを選択し、「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する