opencv 寻找亚像素角点



opencv 寻找亚像素角点

void CImageProcess::FindCorner()
{
 const int MAX_CORNERS = 1000 ; 
 CvPoint2D32f* corners = new CvPoint2D32f[ MAX_CORNERS ]; 
 int corner_count = MAX_CORNERS; 
 int half_win_size = 3 ;//the window size will be 3+1+3=7
 int iteration = 20; 
 double epislon = 1;
 double quality_level = 0.1; //OR 0.01 
 double min_distance = 5; 

 IplImage* image = GetBuffer_cv();
 IplImage* img_gray = cvCreateImage(cvGetSize( image ),IPL_DEPTH_8U, 1) ; 
 IplImage* eig_image = cvCreateImage(cvGetSize( image ),IPL_DEPTH_32F, 1); 
 IplImage* temp_image = cvCloneImage( eig_image ) ; 
 cvGoodFeaturesToTrack( 
         image, 
         eig_image,          
         temp_image, 
         corners, 
         &corner_count, 
         quality_level, 
         min_distance 
     ); 

  cvFindCornerSubPix( 
   image, 
   corners, 
   corner_count, 
   cvSize(half_win_size,half_win_size), 
   cvSize(-1,-1),//no ignoring the neighbours of the center corner 
   cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,iteration,epislon) 
   ); 

 //draw subpix corners on "img_copy" 
 IplImage* img_copy = cvCreateImage(cvSize(image->width,image->height),8,3);
 //cvSplit(src, dst1, dst2, dst3, NULL);
 cvMerge(image, NULL, NULL, NULL, img_copy);

 cvLine(  
  img_copy, 
  cvPoint(0,0) , 
  cvPoint(img_copy->width,img_copy->height),
  CV_RGB(255,0,0), 
  5 
  );
 for (int i=0;i<corner_count;i++)
 { 
  float xxx=corners[i].x;
  float yyy = corners[i].y;
  cvLine(  
   img_copy, 
   cvPoint(corners[i].x,corners[i].y) , 
   cvPoint(corners[i].x,corners[i].y), 
   CV_RGB(255,0,0), 
   5 
   ); 
 }
 CString str;
 CvScalar mean;
 mean = cvAvg(image);
 str.Format("test\\%.0fjiaodian.bmp",mean.val[0]);
 cvSaveImage(str,img_copy);
}


cvFindCornerSubPix是角点寻找函数

其中cvTermCriteria解释如下:

  1. CvTermCriteria  
  2. 迭代算法的终止准则  
  3. #define CV_TERMCRIT_ITER    1  
  4. #define CV_TERMCRIT_NUMBER  CV_TERMCRIT_ITER  
  5. #define CV_TERMCRIT_EPS     2  
  6.   
  7. typedef struct CvTermCriteria  
  8.  {  
  9.   int    type;  /* CV_TERMCRIT_ITER 和CV_TERMCRIT_EPS二值之一,或者二者的组合 */  
  10.   int    max_iter; /* 最大迭代次数 */  
  11.   double epsilon; /* 结果的精确性 */  
  12.  }  
  13.  CvTermCriteria;  
  14. /* 构造函数 */  
  15. inline  CvTermCriteria  cvTermCriteria( int type, int max_iter, double epsilon );  
  16. /* 在满足max_iter和epsilon的条件下检查终止准则并将其转换使得type=CV_TERMCRIT_ITER+CV_TERMCRIT_EPS */  
  17. CvTermCriteria cvCheckTermCriteria( CvTermCriteria criteria,  
  18.                                     double default_eps,  
  19.                                     int default_max_iters );  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值