//cvCornerHarris 角点提取 精度低
//cvCornerHarris函数检测的结果实际上是一幅包含Harris角点的浮点型单通道图像如果要计算Harris角点列表,需要使用
cvGoodFeatureToTrack函数,并传递适当的参数。
#include "cv.h"
#include "highgui.h"
#include "iostream"
using namespace std;
int main(int argc,char** argv)
{
IplImage* pImg;
IplImage* pHarrisImg;
IplImage* grayImage;
IplImage* dst8;
double minVal=0.0, maxVal=0.0;
double scale, shift;
double min=0, max=255;
//载入图像
if((pImg=cvLoadImage("D:\\03.jpg",1))!=NULL)
{
cvNamedWindow("source",1);
cvShowImage("source",pImg);
pHarrisImg=cvCreateImage(cvGetSize(pImg),IPL_DEPTH_32F,1); //IPL_DEPTH_32F - 单精度浮点数
//there we should define IPL_DEPTH_32F rather than IPL_DEPTH_8U, 必须是32F 不能为8U否则运行不出来
grayImage=cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);
dst8=cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);//this is for the result image 输出图像
grayImage->origin=pImg->origin; //there make sure the same origin between grayImage and pImg
cvCvtColor(pImg,grayImage,CV_BGR2GRAY);//cause harris need gray scale image,we should convert RGB 2 gray ) 彩色图转换
为灰度图
int block_size=7;
//do harris algorithm 做harris算法
cvCornerHarris(grayImage,pHarrisImg,block_size,3,0.04); //cvCornerHarris函数检测的结果实际上是一幅包含Harris角点的浮
点型单通道图像如果要计算Harris角点列表,需要使用cvGoodFeatureToTrack函数,并传递适当的参数。
//convert scale so that we see the clear image
cvMinMaxLoc(pHarrisImg,&minVal,&maxVal,NULL,NULL,0);
// cvMinMaxLoc()找出图片或一组数据中最大值及最小值的数据,以及最大值及最小值的位置
cout<<minVal<<endl;
cout<<maxVal<<endl;
scale=(max-min)/(maxVal-minVal);
shift=-minVal*scale+min;
cvConvertScale(pHarrisImg,dst8,scale,shift);//使用线性变换转换数组,先对输入数组的元素进行比例缩放,然后将shift加到比例
缩放后得到的各元素上,即: dst(I)=src(I)*scale + (shift,shift,...),最后可选的类型转换将结果拷贝到输出数组
cvNamedWindow("Harris",0);
cvShowImage("Harris",dst8);
cvWaitKey(0);
cvDestroyWindow("source");
cvDestroyWindow("Harris");
cvReleaseImage(&dst8);
cvReleaseImage(&pHarrisImg);
return 0;
}
return 1;
}
原图:
实验结果: