opencv cvPreCornerDetect
关于OpenCv中cvPreCornerDetect 运行出错解决方法
http://m.blog.csdn.net/blog/wode0239
由于书本上示例的不全,相信大家在做的时候,肯定是无从下手。
而且就算做了,会遇到各种错误。
我也是初学,也遇到各种Exception。
相信大家遇到的问题就是如何将load的image转换为32FC1
我花了一个晚上,终于功夫不负有心人,终于解决这个问题了。
我们知道由于cvPreCornerDetect 接收的参数,只能是浮点型的单通道图像
而我们load进来的图像,默认是char 类型的3通道的图像,那么到底如何转换呢
转换图像有两个方法,一个是cvConvert或者cvConvertScale ,另一个是cvCvtColor.
根据我的测试,得到如下结果
//单纯的使用cvConvertScale(image,temp);,只能转换相同通道不同值深度的图像
//然后在使用cvCvtColor(temp,out,CV_RGB2GRAY); 这个函数也只能转换相同深度,不同通道的图像
所以我们要结合使用才能将我们传入的8UC3转为32FC1
下面直接看代码吧
这是我经过测试的函数,可以运行,并出图像
//计算用于角点检测的特征图,大家只需要在main里,调用,并将图像指针传入。运行,即可得到结果
void doPreCornerDetect(IplImage* image)
{
IplImage* temp = cvCreateImage(cvGetSize(image),IPL_DEPTH_32F,3);
//由于cvPreCornerDetect只接收 32FC1图像,所以应该讲传入的image转换
//单纯的使用cvConvertScale(image,temp);,只能转换相同通道不同值深度的图像
//然后在使用cvCvtColor(temp,out,CV_RGB2GRAY); 这个函数也只能转换相同深度,不同通道的图像
cvConvertScale(image,temp);
IplImage* out = cvCreateImage(cvGetSize(temp),IPL_DEPTH_32F,1);
cvCvtColor(temp,out,CV_RGB2GRAY);
IplImage* corners = cvCloneImage(out);
/*IplImage* dilated_corners = cvCloneImage(temp);
IplImage* corner_mask = cvCreateImage( cvGetSize(temp), 8, 1 );*/
cvPreCornerDetect( out, corners, 3 );
// 扩张
/*cvDilate( corners, dilated_corners, 0, 1 );
cvSub( corners, dilated_corners, corners );
cvCmpS( corners, 0, corner_mask, CV_CMP_GE );*/
cvNamedWindow("PreCornerDetect");
cvShowImage("PreCornerDetect",corners);
cvWaitKey(0);
cvReleaseImage( &out );
cvReleaseImage( &corners );
//cvReleaseImage( &dilated_corners );
cvReleaseImage(&temp);
}