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

    在做目标跟踪的仿真实验时,为了定量分析算法的跟踪准确性。我们需要分析目标跟踪结果的质心坐标和目标实际质心坐标的误差绝对值。
 
    目标的跟踪结果质心坐标可是使用椭圆标识框的中心代替。那么实际质心坐标怎么得到呢?立体标定?算了,没有实际的摄像机。
 
    还是用“人工手动逐帧标定”吧。(其实是很笨的方法,得一帧一帧的弄。)
 
    步骤如下:
    用矩形框选定跟踪物体,计算质心,输出质心坐标到文件。
 
    执行时就是不断地:选择物体->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;
int select_object = 0;
CvPoint origin;
CvRect selection;
 
ofstream fout("real_position.txt");
 
 
void on_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;
       CvPoint2D 32f 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,"Could not 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;
}
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值