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解释如下:
- CvTermCriteria
- 迭代算法的终止准则
- #define CV_TERMCRIT_ITER 1
- #define CV_TERMCRIT_NUMBER CV_TERMCRIT_ITER
- #define CV_TERMCRIT_EPS 2
- typedef struct CvTermCriteria
- {
- int type; /* CV_TERMCRIT_ITER 和CV_TERMCRIT_EPS二值之一,或者二者的组合 */
- int max_iter; /* 最大迭代次数 */
- double epsilon; /* 结果的精确性 */
- }
- CvTermCriteria;
- /* 构造函数 */
- inline CvTermCriteria cvTermCriteria( int type, int max_iter, double epsilon );
- /* 在满足max_iter和epsilon的条件下检查终止准则并将其转换使得type=CV_TERMCRIT_ITER+CV_TERMCRIT_EPS */
- CvTermCriteria cvCheckTermCriteria( CvTermCriteria criteria,
- double default_eps,
- int default_max_iters );