opencv harris角点检测

//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;
}

原图:

opencv harris角点检测_第1张图片

 

 

实验结果:

 opencv harris角点检测_第2张图片

 

你可能感兴趣的:(opencv harris角点检测)