第十章 跟踪与运动 opencv cvFindCornerSubPi

cvFindCornerSubPix利用cvGoodFeaturesToTrack检测出来的角点的基础上,能够将角点位置精确到亚像素级精度.


  1. void cvCornerSubPix(
  2.    const CvArr* image;
  3.    CvPoint2D32f* corners;
  4.    int count;
  5.    CvSize win;
  6.    CvSize zero_zone;
  7.    CvTermCriteria criteria
  8. );
  9.  
  10. -win指定解析求解压精度像素位置等式产生窗口尺寸。
  11. -zero_zone定义一个禁区,剔除角点附近产生的微小特征值。
  12. -

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include <cv.h>  
  3. #include <cxcore.h>  
  4. #include <highgui.h>  
  5.   
  6.   
  7. #pragma comment(lib, "opencv_core220d.lib")  
  8. #pragma comment(lib, "opencv_highgui220d.lib")  
  9. #pragma comment(lib, "opencv_imgproc220d.lib")  
  10.   
  11.   
  12.   
  13. int main(int argc, char** argv)  
  14. {  
  15.     FILE* fp = fopen("d:\\result.txt","w+" ) ;  
  16.     const char* filename = "D:\\mochen_WIN32\\opencv\\CH10\\one_way_train_0001.jpg" ;  
  17.     //const char* windowname = "http://blog.csdn.net/moc062066" ;  
  18.   
  19.     //img AND img_copy is the same,use to draw different result   
  20.     IplImage* img = cvLoadImage(filename,CV_LOAD_IMAGE_COLOR );  
  21.     IplImage* img_copy = cvCloneImage( img ) ;//a copy of img  
  22.     IplImage* img_gray = cvCreateImage(cvGetSize( img ),IPL_DEPTH_8U, 1) ;  
  23.     IplImage* eig_image = cvCreateImage(cvGetSize( img ),IPL_DEPTH_32F, 1);  
  24.     IplImage* temp_image = cvCloneImage( eig_image ) ;  
  25.   
  26.     cvCvtColor(img,img_gray,CV_BGR2GRAY);  
  27.   
  28.     const int MAX_CORNERS = 1000 ;  
  29.     CvPoint2D32f* corners = new CvPoint2D32f[ MAX_CORNERS ];  
  30.     int corner_count = MAX_CORNERS;  
  31.     double quality_level = 0.1; //OR 0.01  
  32.     double min_distance = 5;  
  33.   
  34.     cvGoodFeaturesToTrack(  
  35.         img_gray,  
  36.         eig_image,           
  37.         temp_image,  
  38.         corners,  
  39.         &corner_count,  
  40.         quality_level,  
  41.         min_distance  
  42.     );  
  43.   
  44.     //draw corners from cvGoodFeaturesToTrack on "img"  
  45.     for (int i = 0 ; i < corner_count ; ++i){  
  46.         cvLine(   
  47.             img,  
  48.             cvPoint(corners[i].x,corners[i].y) ,  
  49.             cvPoint(corners[i].x,corners[i].y),  
  50.             CV_RGB(255,0,0),  
  51.             5  
  52.         );  
  53.         fprintf(fp,"\t%f\t%f\n",corners[i].x,corners[i].y) ;  
  54.     }  
  55.       
  56.     fprintf(fp,"\n\n\n\n\n") ;  
  57.   
  58.     int half_win_size = 3;//the window size will be 3+1+3=7  
  59.     int iteration = 20;  
  60.     double epislon = 0.1;  
  61.   
  62.     cvFindCornerSubPix(  
  63.         img_gray,  
  64.         corners,  
  65.         corner_count,  
  66.         cvSize(half_win_size,half_win_size),  
  67.         cvSize(-1,-1),//no ignoring the neighbours of the center corner  
  68.         cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,iteration,epislon)  
  69.         );  
  70.   
  71.     //draw subpix corners on "img_copy"  
  72.     for (int i=0;i<corner_count;i++){  
  73.         cvLine(   
  74.             img_copy,  
  75.             cvPoint(corners[i].x,corners[i].y) ,  
  76.             cvPoint(corners[i].x,corners[i].y),  
  77.             CV_RGB(255,0,0),  
  78.             5  
  79.         );  
  80.         fprintf(fp,"\t%f\t%f\n",corners[i].x,corners[i].y) ;  
  81.     }  
  82.   
  83.     cvNamedWindow("cvFindCornerSubPix", CV_WINDOW_AUTOSIZE );  
  84.     cvShowImage( "cvFindCornerSubPix", img );  
  85.     cvNamedWindow("cvGoodFeaturesToTrack", CV_WINDOW_AUTOSIZE );  
  86.     cvShowImage( "cvGoodFeaturesToTrack", img_copy );  
  87.   
  88.   
  89.     cvWaitKey(0);  
  90.   
  91.     cvReleaseImage(&img_gray);  
  92.     cvReleaseImage(&img);  
  93.     cvReleaseImage(&img_copy);  
  94.     cvDestroyWindow("cvGoodFeaturesToTrack");  
  95.     cvDestroyWindow("cvFindCornerSubPix");  
  96.   
  97.     return 0;  
  98. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值