-2

みんな。オブジェクトを追跡するためのコードを以下に示しました。バックグラウンド減算の結果も示しています。ここでは、フレーム差分法を使用しています。今私の問題は、その動くオブジェクトをカラー ビデオ ファイルから抽出する必要があることです。セグメンテーションを行いました。しかし、検出のために、境界ボックスを描画した領域を抽出したいと考えています。だから誰でもこれで私を助けることができます...お願いします。前もって感謝します。

 int main(int argc, char* argv[])
               {



                CvSize imgSize;
            //CvCapture *capture =     cvCaptureFromFile("S:\\offline object detection database\\video1.avi");
            CvCapture *capture =     cvCaptureFromFile("S:\\offline object detection database\\SINGLE PERSON Database\\Walk1.avi");

                if(!capture){
                 printf("Capture failure\n");
                 return -1;
                }

                 IplImage* frame=0;
                 frame = cvQueryFrame(capture);           
                 if(!frame)
         return -1;

                 imgSize = cvGetSize(frame);

                 IplImage* greyImage = cvCreateImage( imgSize, IPL_DEPTH_8U, 1);
                 IplImage* colourImage;
                 IplImage* movingAverage = cvCreateImage( imgSize, IPL_DEPTH_32F, 3);
                 IplImage* difference;
                 IplImage* temp;
                 IplImage* motionHistory = cvCreateImage( imgSize, IPL_DEPTH_8U, 3);

                 CvRect bndRect = cvRect(0,0,0,0);
                 CvPoint pt1, pt2;
                 CvFont font;
                 int prevX = 0;
                 int numPeople = 0;
                 char wow[65];
                 int avgX = 0;
                 bool first = true;                   
                 int closestToLeft = 0;
                 int closestToRight = 320;


                 for(;;)
                {
                colourImage = cvQueryFrame(capture);
                if( !colourImage )
                {
                     break;
                }
                if(first)
                {
                 difference = cvCloneImage(colourImage);
                 temp = cvCloneImage(colourImage);
                 cvConvertScale(colourImage, movingAverage, 1.0, 0.0);
                 first = false;
                }
                else
                {
                cvRunningAvg(colourImage, movingAverage, 0.020, NULL);
                }
                cvConvertScale(movingAverage,temp, 1.0, 0.0);
            cvAbsDiff(colourImage,temp,difference);     
                cvCvtColor(difference,greyImage,CV_RGB2GRAY);       
                cvThreshold(greyImage, greyImage, 80, 250, CV_THRESH_BINARY);
        cvSmooth(greyImage, greyImage,2);
                cvDilate(greyImage, greyImage, 0, 1);
                cvErode(greyImage, greyImage, 0, 1);
        cvShowImage("back", greyImage);
                CvMemStorage* storage = cvCreateMemStorage(0);
                CvSeq* contour = 0;     
                cvFindContours( greyImage, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

        for( ; contour != 0; contour = contour->h_next )
                {
                bndRect = cvBoundingRect(contour, 0);          
            pt1.x = bndRect.x;
                pt1.y = bndRect.y;
                pt2.x = bndRect.x + bndRect.width;
                pt2.y = bndRect.y + bndRect.height;         
                avgX = (pt1.x + pt2.x) / 2;

                if(avgX > 90 && avgX < 250)
                {
                if(closestToLeft >= 88 && closestToLeft <= 90)
                {
                 if(avgX > prevX)
                {
                 numPeople++;
                 closestToLeft = 0;
                }
                }
                else if(closestToRight >= 250 && closestToRight <= 252)
                {
                if(avgX < prevX)
                {
                numPeople++;
                closestToRight = 220;
                }
                }                          
                cvRectangle(colourImage, pt1, pt2, CV_RGB(255,0,0), 1);
                }
                if(avgX > closestToLeft && avgX <= 90)
                {
                 closestToLeft = avgX;
                 }
                 if(avgX < closestToRight && avgX >= 250)
                 {
                 closestToRight = avgX;
                 }
                 prevX = avgX;
                 }
                 cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.8, 0.8, 0, 2);
                 cvPutText(colourImage, _itoa(numPeople, wow, 10), cvPoint(60, 200), &font, cvScalar(0, 0, 300));
                 cvShowImage("My Window", colourImage);
         cvShowImage("fore", greyImage); 
                 cvWaitKey(10);                     
                  }
                  cvReleaseImage(&temp);
                  cvReleaseImage(&difference);
                  cvReleaseImage(&greyImage);
                  cvReleaseImage(&movingAverage);
                  cvDestroyWindow("My Window");
                  cvReleaseCapture(&capture);   
                  return 0;     
                  }
4

2 に答える 2

0

あなたが使用している「レガシー」インターフェースではなく、新しいOpenCVインターフェースでそれを行う方法を知っています。次のようになります。

cv::Mat frame_m(frame);
...

cv::Mat region_m = frame_m(cv::Rect(bndRect));
IplImage region = region_m; // use &iplimg when an IplImage* is needed.

インターフェイスを混在させたくない場合は、新しいインターフェイスを学習するときです。

于 2013-05-24T11:27:25.200 に答える