0

OpenCV 2.4.6 と Visual C++ 2010 を使用しています。以下のコードで赤色を追跡しようとしています。cvInRangeS を使用して画像から RED オブジェクトを取得していますが、その画像はバイナリ画像です。次に、cvFindContours(..) を使用して、オブジェクトの輪郭を見つけたいと思います。ただし、cvFindcontours(..) は常に 1 を返します。画像内の輪郭の位置を取得するために cvBoundingRect(..) も使用しています。私が得ている長方形の位置は常に(1,1,638,478)です。cvFindcontour(..) が画像全体を単一の輪郭として取っていることを意味します。等高線で RED オブジェクトのみを取得するにはどうすればよいですか?

int main()
{
IplImage*   mCVImageColor = cvCreateImageHeader(cvSize(640,480), IPL_DEPTH_8U, 3);
IplImage* imgTracking;

CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY );
namedWindow( "Display image", CV_WINDOW_AUTOSIZE );
namedWindow( "Display window", CV_WINDOW_AUTOSIZE );
namedWindow( "Display tracking", CV_WINDOW_AUTOSIZE );
namedWindow( "Display thresh", CV_WINDOW_AUTOSIZE );
CvRect rect;
CvMemStorage *storage = cvCreateMemStorage(0);
CvSeq *contours=0;
while(1)
{
    IplImage* mCVImageColor = cvQueryFrame( capture );
    cvSmooth(mCVImageColor, mCVImageColor, CV_GAUSSIAN,3,3); 
    imgTracking=cvCreateImage(cvGetSize(mCVImageColor),IPL_DEPTH_8U, 1);

    IplImage* imgHSV = cvCreateImage(cvGetSize(mCVImageColor), IPL_DEPTH_8U, 3); 
    IplImage* imgThresh=cvCreateImage(cvGetSize(mCVImageColor),8, 1);
    cvCvtColor(mCVImageColor, imgHSV, CV_BGR2HSV);

    cvInRangeS(imgHSV, cvScalar(170,160,60), cvScalar(180,255,256), imgThresh); 

    cvAdd(imgThresh, imgTracking, imgTracking);
    cvConvertScale(imgTracking, imgTracking, 1.0, 0.0);
    int x = cvFindContours(imgTracking,storage,&contours,sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(2, 2));
    printf("%d\n",contours->total);
    for (; contours != 0; contours = contours->h_next)
    {
        rect = cvBoundingRect(contours); //extract bounding box for current contour
        //drawing rectangle
        cvRectangle(mCVImageColor,cvPoint(rect.x, rect.y),cvPoint(rect.x+rect.width, rect.y+rect.height),cvScalar(0, 0, 255),2, 8, 0);  
        printf("%d   %d  %d  %d\n",rect.x, rect.y,rect.width,rect.height);
        if(rect.width*rect.height<1400)
        {
            CvPoint centroid[1];
            centroid[0].x = cvRound((rect.x+rect.width)/2);
            centroid[0].y = cvRound((rect.y+rect.height)/2);
            cvCircle( mCVImageColor, centroid[0], 5, CV_RGB(255, 0, 0),10, -1);
        }
    }
    cvShowImage("Display tracking",imgTracking);
    cvShowImage("Display window",imgHSV);
    cvShowImage("Display image",mCVImageColor);
    cvShowImage("Display thresh",imgThresh);
    cvClearMemStorage( storage );
    contours = 0;
    //cvReleaseImage(&imgHSV);
    //cvReleaseImage(&imgThresh);  
    int c = waitKey(20);
    if(c=='q')
        break;
}

}

4

0 に答える 0