キャニーフィルターと輪郭検出機能に基づいて、ビデオカメラ/ウェブカメラを使用して、任意の形状のオブジェクトを検出するプログラムを作成しようとしています。これが私のプログラムです:
int main( int argc, char** argv )
{
CvCapture *cam;
CvMoments moments;
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contours = NULL;
CvSeq* contours2 = NULL;
CvPoint2D32f center;
int i;
cam=cvCaptureFromCAM(0);
if(cam==NULL){
fprintf(stderr,"Cannot find any camera. \n");
return -1;
}
while(1){
IplImage *img=cvQueryFrame(cam);
if(img==NULL){return -1;}
IplImage *src_gray= cvCreateImage( cvSize(img->width,img->height), 8, 1);
cvCvtColor( img, src_gray, CV_BGR2GRAY );
cvSmooth( src_gray, src_gray, CV_GAUSSIAN, 5, 11);
cvCanny(src_gray, src_gray, 70, 200, 3);
cvFindContours( src_gray, storage, &contours, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
if(contours==NULL){ contours=contours2;}
contours2=contours;
cvMoments(contours, &moments, 1);
double m_00 = cvGetSpatialMoment( &moments, 0, 0 );
double m_10 = cvGetSpatialMoment( &moments, 1, 0 );
double m_01 = cvGetSpatialMoment( &moments, 0, 1 );
float gravityX = (m_10 / m_00)-150;
float gravityY = (m_01 / m_00)-150;
if(gravityY>=0&&gravityX>=0){
printf("center point=(%.f, %.f) \n",gravityX,gravityY); }
for (; contours != 0; contours = contours->h_next){
CvScalar color = CV_RGB(250,0,0);
cvDrawContours(img,contours,color,color,-1,-1, 8, cvPoint(0,0));
}
cvShowImage( "Input", img );
cvShowImage( "Contours", src_gray );
cvClearMemStorage(storage);
if(cvWaitKey(33)>=0) break;
}
cvDestroyWindow("Contours");
cvDestroyWindow("Source");
cvReleaseCapture(&cam);
}
このプログラムは、カメラによってキャプチャされたすべての輪郭を検出し、輪郭の平均座標が出力されます。私の質問は、オブジェクトのより正確な (x,y) 位置を取得できるように、1 つのオブジェクト/輪郭のみを除外する方法です。可能であれば、(x,y) 座標を使用してオブジェクトの中心をマークする方法を教えてもらえますか?
前もって感謝します。乾杯
p/s: 申し訳ありませんが、まだスクリーンショットをアップロードできませんでした。何かお役に立てれば、こちらのリンクをご覧ください。
編集:私の質問をより明確にするために:
- たとえば、上のスクリーンショットから正方形のみを除外したい場合、どうすればよいですか?
- 除外したいオブジェクトには最大の輪郭領域があり、最も重要なことは、直線や曲線ではなく、形状 (任意の形状) を持っていることです。
- 私はまだ滑らかでキャニーな値を試しているので、誰かが私のプログラムを使用して輪郭を検出するのに問題がある場合は、値を変更してください.