打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
跟踪误差分析中的实际位置计算

 

   在做目标跟踪的仿真实验时,为了定量分析算法的跟踪准确性。我们需要分析目标跟踪结果的质心坐标和目标实际质心坐标的误差绝对值。

 

   目标的跟踪结果质心坐标可是使用椭圆标识框的中心代替。那么实际质心坐标怎么得到呢?立体标定?算了,没有实际的摄像机。

 

   还是用“人工手动逐帧标定”吧。(其实是很笨的方法,得一帧一帧的弄。)

 

   步骤如下:

   用矩形框选定跟踪物体,计算质心,输出质心坐标到文件。

 

   执行时就是不断地:选择物体->Enter->选择物体->Enter……

 

   程序如下:

 

#include"cv.h"

#include"highgui.h" 

#include<stdio.h> 

#include<ctype.h> 

#include"iostream.h"

#include"fstream.h"

 

IplImage*image = 0;

IplImage*gray = 0;

IplImage*bi = 0;

intselect_object = 0;

CvPointorigin;

CvRectselection;

 

ofstreamfout("real_position.txt");

 

 

voidon_mouse( int event, int x, int y, int flags,void* param)

{

   if( !image )

       return;

 

   if( image->origin )//origin=1,底左结构

       y = image->height - y;// 换成顶左

 

   if( select_object )//如果处于选择跟踪物体阶段,则对selection用当前的鼠标位置进行设置

   {

       selection.x = MIN(x,origin.x);

       selection.y = MIN(y,origin.y);

       selection.width = selection.x + CV_IABS(x - origin.x);

       selection.height = selection.y + CV_IABS(y - origin.y);

       

       selection.x = MAX( selection.x, 0 );

       selection.y = MAX( selection.y, 0 );

       selection.width = MIN( selection.width, image->width);

       selection.height = MIN( selection.height,image->height );

       selection.width -= selection.x;

       selection.height -= selection.y;

 

 

   }

      cvRectangle(image, cvPoint( selection.x, selection.y),

                   cvPoint(selection.x+selection.width,selection.y+selection.height),

                     CV_RGB(255,0,0), 1, 8, 0 );

      cvShowImage( "Demo", image );

 

   switch( event )

   {

   case CV_EVENT_LBUTTONDOWN:

       origin = cvPoint(x,y);

       selection = cvRect(x,y,0,0);

       select_object = 1;

       break;

   case CV_EVENT_LBUTTONUP:

       select_object = 0;

 

#ifdef_DEBUG

   printf("\n # 鼠标的选择区域:");

   printf("\n   X =%d, Y = %d, Width = %d, Height = %d \n",

       selection.x, selection.y, selection.width,selection.height);

      

      gray=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);

      bi=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);

      cvCvtColor(image,gray,CV_RGB2GRAY);

      cvThreshold(gray,bi,60,255,CV_THRESH_BINARY);

 

      // 目标质心的计算:

      double M00=0,x0=0,y0=0;

      CvPoint2D32f center;

      CvMoments m;

      CvMat mat;

      cvMoments(cvGetSubRect(bi,&mat,selection),&m,1);

      M00 = cvGetSpatialMoment(&m,0,0);

      x0 =cvGetSpatialMoment(&m,1,0)/M00;//质心

      y0 = cvGetSpatialMoment(&m,0,1)/M00;

      center.x=x0;

      center.y=y0;

      

      fout<<"center_x="<<center.x+selection.x<<" "<<"center_y="<<center.y+selection.y<<endl;

#endif

       break;

   }

}

 

 

int main(int argc, char** argv )

{

   CvCapture* capture = 0;

   IplImage* frame = 0;

   int n=0;

      int c=0;

   char* file_name="..\\video5.avi";

 

   capture = cvCaptureFromAVI( file_name );

   if( !capture )

   {

       fprintf(stderr,"Couldnot initialize capturing...\n");

       return -1;

   }

 

   cvNamedWindow( "Demo", 1 );

   cvSetMouseCallback( "Demo", on_mouse, NULL ); // on_mouse自定义事件

 

   for(;;)

   {

             frame = cvQueryFrame( capture );  

       n++;

       if( !frame ) break;

       if( !image )

       {

           

           image = cvCreateImage( cvGetSize(frame), 8, 3 );

           image->origin =frame->origin;      

       }

       cvCopy( frame, image, 0 );

 

             CvFont font;

             cvInitFont(&font,CV_FONT_VECTOR0,0.5,0.5,0,1.5,8);

             char text[1024];

             sprintf(text,"%dframe",n);

             cvPutText(image,text,cvPoint(20,20),&font,CV_RGB(255,0,0));

 

             cvShowImage( "Demo", image );                

             cvWaitKey(0);

 

       if( c == 27 )//quit the program : 27=='esc'

           break;  //exit from for-loop      

      }

   

   cvWaitKey(0);

   cvReleaseCapture( &capture );

   cvDestroyWindow("CamShiftDemo");

 

   return 0;

}

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
OpenCV学习——眼部识别算法实现
CvBox2D
【图像算法】模板匹配
IOS 图片裁剪 ? IT
无敌猛枪欣赏 -
图像像素点值获取
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服