0

我想在 2 张图像(镜头 A、镜头 B)中跟踪一个对象。我知道第一张照片(ShotA)中物体的位置,但我不知道第二张照片(Shot B)中物体的位置。镜头 A 有多个对象,因此为了跟踪特定对象,我选择要跟踪的对象所在的图像的 ROI。问题是我如何在镜头 B 中跟踪该对象的特征,同时保持相同的 ROI 大小。我可以在不选择 ROI 的情况下在整个图像 B 中跟踪该对象的特征吗?

这是我的代码。目前它在 SHOTB 中选择与 SHOTA 相同的 ROI,但有时 SHOTA 的 ROI 中的对象不在 SHOT B 的 ROI 中。

 IplImage* imgA = cvLoadImage("52783180_RAW_OVR1.jpg",CV_LOAD_IMAGE_GRAYSCALE);

 cvSetImageROI(imgA, cvRect(2300, 1700, 1000,1200));

cvNamedWindow("SHOTA",0);
cvShowImage("SHOTA", imgA);

//cvWaitKey(0);

CvSize      img_sz    = cvGetSize( imgA );
int         win_size = 10;


IplImage* imgB = cvLoadImage("52783180_RAW_OVR2.jpg",CV_LOAD_IMAGE_GRAYSCALE);

cvSetImageROI(imgB, cvRect(2300, 1700, 1000,1200));

cvNamedWindow("SHOTB",0);
cvShowImage("SHOTB", imgB);

IplImage* imgC=cvLoadImage("52783180_RAW_OVR2.jpg",CV_LOAD_IMAGE_UNCHANGED);

cvSetImageROI(imgC, cvRect(2300, 1700, 1000,1200));

//cvNamedWindow("SHOTA",0);
//cvShowImage("SHOTA", imgA);

IplImage* eig_image = cvCreateImage( img_sz, IPL_DEPTH_32F, 1 );
IplImage* tmp_image = cvCreateImage( img_sz, IPL_DEPTH_32F, 1 );
int              corner_count = MAX_CORNERS;
CvPoint2D32f* cornersA        = new CvPoint2D32f[ MAX_CORNERS ];

//cvSetImageROI(imgA, cvRect(2300, 1700, 1000,1200));

cvGoodFeaturesToTrack(
    imgA,
    eig_image,
    tmp_image,
    cornersA,
    &corner_count,
    0.01,
    5.0,
    0,
    3,
    0,
    0.04
);

//cvResetImageROI(imgA);


cvFindCornerSubPix(
    imgA,
    cornersA,
    corner_count,
    cvSize(win_size,win_size),
    cvSize(-1,-1),
    cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03)
);
// Call the Lucas Kanade algorithm
//
char features_found[ MAX_CORNERS ];
float feature_errors[ MAX_CORNERS ];
CvSize pyr_sz = cvSize( imgA->width+8, imgB->height/3 );
IplImage* pyrA = cvCreateImage( pyr_sz, IPL_DEPTH_32F, 1 );
  IplImage* pyrB = cvCreateImage( pyr_sz, IPL_DEPTH_32F, 1 );
  CvPoint2D32f* cornersB        = new CvPoint2D32f[ MAX_CORNERS ];
   cvCalcOpticalFlowPyrLK(
 imgA,
 imgB,
 pyrA,
 pyrB,
 cornersA,
 cornersB,
 corner_count,
 cvSize( win_size,win_size ),
 5,
 features_found,
 feature_errors,
 cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3 ),
 0
 );
 // Now make some image of what we are looking at:
 //
 float sum=0;
  for( int i=0; i<corner_count; i++ ) {
 if( features_found[i]==0|| feature_errors[i]>550 ) {
  //       printf("Error is %f/n",feature_errors[i]);
    continue;
 }

 sum+=(cornersA[i].x-cornersB[i].x)*(cornersA[i].x-cornersB[i].x)+(cornersA[i].y-cornersB[i].y)*(cornersA[i].y-cornersB[i].y);

  //    printf("Got it/n");
 CvPoint p0 = cvPoint(
    cvRound( cornersA[i].x ),
    cvRound( cornersA[i].y )
 );
 CvPoint p1 = cvPoint(
    cvRound( cornersB[i].x ),
    cvRound( cornersB[i].y )
 );
 cvLine( imgC, p0, p1, CV_RGB(255,0,0),2 );
 }

cvResetImageROI(imgC);
sum=sum/corner_count;
printf("%f\n",sum);

 cvNamedWindow("ImageA",0);
 cvNamedWindow("ImageB",0);
 cvNamedWindow("LKpyr_OpticalFlow",0);
 cvShowImage("ImageA",imgA);
 cvShowImage("ImageB",imgB);
 cvShowImage("LKpyr_OpticalFlow",imgC);
 cvWaitKey(0);
4

1 回答 1

0

通过对 GoodfeaturestoTrack 使用掩码而不是 setimageroi 解决了问题

于 2013-02-27T17:04:42.660 回答