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);

}

posted on 2013-11-09 22:43  song2013  阅读(836)  评论(0编辑  收藏  举报

导航