前面的几个参数可以参考网上的资料,主要是设置const CvArr* mask CV_DEFAULT(NULL),因为要对一个点附近的区域进行检测角点,所以用到这个参数。
int main()
{
IplImage * src = cvLoadImage("C:\\Users\\Administrator\\Desktop\\test_image.png",1);
/*cvNamedWindow("show");
cvShowImage("show",src);*/
IplImage * src_gray = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
IplImage * dst_gray = cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);
IplImage * mask = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
cvZero(mask);
// 转换成灰度图
cvCvtColor(src,src_gray,CV_RGB2GRAY);
//cvCvtColor(src,mask,CV_RGB2GRAY);
////设置感兴趣区域
CvRect rect;
rect.x = 250;
rect.y = 230;
rect.width = 20;
rect.height =20;
cvSetImageROI(mask,rect);
cvSet(mask,cvScalar(255));
cvResetImageROI(mask);
CvPoint2D32f* corners = new CvPoint2D32f[1];
int cornercount = 1;
IplImage* corners1= cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
IplImage* corners2= cvCreateImage(cvGetSize(src),IPL_DEPTH_32F, 1);
cvGoodFeaturesToTrack(src_gray,corners1,corners2, corners,&cornercount,0.1,5,mask);
cvResetImageROI(src_gray);
cvNamedWindow("show");
for (int i=0;i < cornercount;i++)
{
cvLine(src, cvPoint(corners[i].x, corners[i].y), cvPoint(corners[i].x, corners[i].y), CV_RGB(255,0,0), 5);
}
cvShowImage("show",src);
cvWaitKey(0);
}
注意三个问题
第一.mask必须是指针类型,这个大小必须和待检测图像一致,即函数的第一个参数。
第二.cvSet()这个函数,可以查阅网上的资料,是第二个参数为第一个参数赋值,这里第一个参数是单通道的,所以只能是cvScalar(255).
第三.cvResetImageROI(mask);这一句很重要,不然程序会报错,因为设置ROI之后,程序会默认你是在用mask的ROI进行计算,就会出现大小不对,和第一点是同一个问题。