CamShift跟踪算法

  1. #ifdef _CH_  
  2. #pragma package <opencv>  
  3. #endif  
  4. #define CV_NO_BACKWARD_COMPATIBILITY  
  5. #ifndef _EiC  
  6. #include "cv.h"  
  7. #include "highgui.h"  
  8. #include <stdio.h>  
  9. #include <ctype.h>  
  10. #endif  
  11. IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0;  
  12. CvHistogram *hist = 0;  
  13. int backproject_mode = 0;  
  14. int select_object = 0;  
  15. int track_object = 0;  
  16. int show_hist = 1;  
  17. CvPoint origin;  
  18. CvRect selection;  
  19. CvRect track_window;  
  20. CvBox2D track_box;  
  21. CvConnectedComp track_comp;  
  22. int hdims = 16;  
  23. float hranges_arr[] = {0,180};  
  24. float* hranges = hranges_arr;  
  25. int vmin = 10vmax = 256smin = 30;  
  26. void on_mouse( int event, int x, int y, int flags, void* param )  
  27. {  
  28.     if( !image )  
  29.         return;  
  30.     if( image->origin )  
  31.         y = image->height - y;  
  32.     if( select_object )  
  33.     {  
  34.         selection.x = MIN(x,origin.x);  
  35.         selection.y = MIN(y,origin.y);  
  36.         selection.width = selection.x + CV_IABS(x - origin.x);  
  37.         selection.height = selection.y + CV_IABS(y - origin.y);  
  38.         selection.x = MAX( selection.x, 0 );  
  39.         selection.y = MAX( selection.y, 0 );  
  40.         selection.width = MIN( selection.width, image->width );  
  41.         selection.height = MIN( selection.height, image->height );  
  42.         selection.width -selection.x;  
  43.         selection.height -selection.y;  
  44.     }  
  45.     switch( event )  
  46.     {  
  47.     case CV_EVENT_LBUTTONDOWN:  
  48.         origin = cvPoint(x,y);  
  49.         selection = cvRect(x,y,0,0);  
  50.         select_object = 1;  
  51.         break;  
  52.     case CV_EVENT_LBUTTONUP:  
  53.         select_object = 0;  
  54.         if( selection.width > 0 && selection.height > 0 )  
  55.             track_object = -1;  
  56.         break;  
  57.     }  
  58. }  
  59. CvScalar hsv2rgb( float hue )  
  60. {  
  61.     int rgb[3], p, sector;  
  62.     static const int sector_data[][3]=  
  63.         {{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}};  
  64.     hue *= 0.033333333333333333333333333333333f;  
  65.     sector = cvFloor(hue);  
  66.     p = cvRound(255*(hue - sector));  
  67.     p ^= sector & 1 ? 255 : 0;  
  68.     rgb[sector_data[sector][0]] = 255;  
  69.     rgb[sector_data[sector][1]] = 0;  
  70.     rgb[sector_data[sector][2]] = p;  
  71.     return cvScalar(rgb[2], rgb[1], rgb[0],0);  
  72. }  
  73. int main( int argc, char** argv )  
  74. {  
  75.     CvCapture* capture = 0;  
  76.     //if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))  
  77.        // capture = cvCaptureFromCAMargc == 2 ? argv[1][0] - '0' : 0 );  
  78.     //else if( argc == 2 )  
  79.         //capture = cvCaptureFromAVI( argv[1] );  
  80. capture = cvCaptureFromAVI("D:\\My Documents\\Visual Studio 2008\\Projects\\camshift\\Debug\\camera2.avi");//添加视频地址  
  81.     if( !capture )  
  82.     {  
  83.         fprintf(stderr,"Could not initialize capturing...\n");  
  84.         return -1;  
  85.     }  
  86.     printf( "Hot keys: \n"  
  87.         "\tESC - quit the program\n"  
  88.         "\tc - stop the tracking\n"  
  89.         "\tb - switch to/from backprojection view\n"  
  90.         "\th - show/hide object histogram\n"  
  91.         "To initialize tracking, select the object with mouse\n" );  
  92.     cvNamedWindow( "Histogram", 1 );  
  93.     cvNamedWindow( "CamShiftDemo", 1 );  
  94.     cvSetMouseCallback( "CamShiftDemo", on_mouse, 0 );  
  95.    // cvCreateTrackbar( "Vmin", "CamShiftDemo", &vmin, 256, 0 );  
  96.    // cvCreateTrackbar( "Vmax", "CamShiftDemo", &vmax, 256, 0 );  
  97.    // cvCreateTrackbar( "Smin", "CamShiftDemo", &smin, 256, 0 );  
  98.     for(;;)  
  99.     {  
  100.         IplImage* frame = 0;  
  101.         int i, bin_w, c;  
  102.         frame = cvQueryFrame( capture );  
  103.         if( !frame )  
  104.             break;  
  105.         if( !image )  
  106.         {  
  107.             /* allocate all the buffers */  
  108.             image = cvCreateImage( cvGetSize(frame), 8, 3 );  
  109.             image->origin = frame->origin;  
  110.             hsv = cvCreateImage( cvGetSize(frame), 8, 3 );  
  111.             hue = cvCreateImage( cvGetSize(frame), 8, 1 );  
  112.             mask = cvCreateImage( cvGetSize(frame), 8, 1 );  
  113.             backproject = cvCreateImage( cvGetSize(frame), 8, 1 );  
  114.             hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 );  
  115.             histimg = cvCreateImage( cvSize(320,200), 8, 3 );  
  116.             cvZero( histimg );  
  117.         }  
  118.         cvCopy( frame, image, 0 );  
  119.         cvCvtColor( image, hsv, CV_BGR2HSV );  
  120.         if( track_object )  
  121.         {  
  122.             int _vmin = vmin_vmax = vmax;  
  123.             cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),  
  124.                         cvScalar(180,256,MAX(_vmin,_vmax),0), mask );  
  125.             cvSplit( hsv, hue, 0, 0, 0 );  
  126.             if( track_object < 0 )  
  127.             {  
  128.                 float max_val = 0.f;  
  129.                 cvSetImageROI( hue, selection );  
  130.                 cvSetImageROI( mask, selection );  
  131.                 cvCalcHist( &hue, hist, 0, mask );  
  132.                 cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );  
  133.                 cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );  
  134.                 cvResetImageROI( hue );  
  135.                 cvResetImageROI( mask );  
  136.                 track_window = selection;  
  137.                 track_object = 1;  
  138.                 cvZero( histimg );  
  139.                 bin_w = histimg->width / hdims;  
  140.                 for( i = 0; i < hdims; i++ )  
  141.                 {  
  142.                     int val = cvRound( cvGetReal1D(hist->bins,i)*histimg->height/255 );  
  143.                     CvScalar color = hsv2rgb(i*180.f/hdims);  
  144.                     cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),  
  145.                                  cvPoint((i+1)*bin_w,histimg->height - val),  
  146.                                  color, -1, 8, 0 );  
  147.                 }  
  148.             }  
  149.             cvCalcBackProject( &hue, backproject, hist );  
  150.             cvAnd( backproject, mask, backproject, 0 );  
  151.             cvCamShift( backproject, track_window,  
  152.                         cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),  
  153.                         &track_comp, &track_box );  
  154.             track_window = track_comp.rect;  
  155.             if( backproject_mode )  
  156.                 cvCvtColor( backproject, image, CV_GRAY2BGR );  
  157.             if( !image->origin )  
  158.                 track_box.angle = -track_box.angle;  
  159.             cvEllipseBox( image, track_box, CV_RGB(255,0,0), 3, CV_AA, 0 );  
  160.         }  
  161.         if( select_object && selection.width > 0 && selection.height > 0 )  
  162.         {  
  163.             cvSetImageROI( image, selection );  
  164.             cvXorS( image, cvScalarAll(255), image, 0 );  
  165.             cvResetImageROI( image );  
  166.         }  
  167.         cvShowImage( "CamShiftDemo", image );  
  168.         cvShowImage( "Histogram", histimg );  
  169.         c = cvWaitKey(10);  
  170.         if( (char) c == 27 )  
  171.             break;  
  172.         switch( (char) c )  
  173.         {  
  174.         case 'b':  
  175.             backproject_mode ^= 1;  
  176.             break;  
  177.         case 'c':  
  178.             track_object = 0;  
  179.             cvZero( histimg );  
  180.             break;  
  181.         case 'h':  
  182.             show_hist ^= 1;  
  183.             if( !show_hist )  
  184.                 cvDestroyWindow( "Histogram" );  
  185.             else  
  186.                 cvNamedWindow( "Histogram", 1 );  
  187.             break;  
  188.         default:  
  189.             ;  
  190.         }  
  191.     }  
  192.     cvReleaseCapture( &capture );  
  193.     cvDestroyWindow("CamShiftDemo");  
  194.     return 0;  
  195. }  
  196. #ifdef _EiC  
  197. main(1,"camshiftdemo.c");  
  198. #endif  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值