opencv 图象角点检测

Code:

#include<iostream>2
using namespace cv;
using namespace std;
#include <cv.h>
#include <math.h>


//by Huang, Haiqiao 5 Dec. 2009
int main(int argc, char** argv)
{
   cout << "Corner Detection OpenCV!"<<endl; 
   char* filename="e://kankan//fish.jpg";
   IplImage* imgRGB = cvLoadImage(filename); 
   IplImage* imgRGB2 = cvLoadImage(filename); 
   IplImage* imgGrey = cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE); 
    
   if (imgGrey==NULL){//image validation
      cout << "No valid image input."<<endl; 
      char c=getchar();
      return 1;
   } 
   int w=imgGrey->width;
   int h=imgGrey->height;

   IplImage* eig_image = cvCreateImage(cvSize(w, h),IPL_DEPTH_32F, 1);
   IplImage* temp_image = cvCreateImage(cvSize(w, h),IPL_DEPTH_32F, 1); 

   const int MAX_CORNERS = 140;//estimate a corner number
   CvPoint2D32f corners[MAX_CORNERS] = {0};// coordinates of corners
   //CvPoint2D32f* corners = new CvPoint2D32f[ MAX_CORNERS ]; //another method of declaring an array
   int corner_count = MAX_CORNERS; 
   double quality_level = 0.1;//threshold for the eigenvalues
   double min_distance = 5;//minimum distance between two corners
   int eig_block_size = 3;//window size
   int use_harris = false;//use 'harris method' or not

   //----------initial guess by cvGoodFeaturesToTrack---------------
   cvGoodFeaturesToTrack(imgGrey,
            eig_image,   // output                 
            temp_image,
            corners,
            &corner_count,
            quality_level,
            min_distance,
            NULL,
            eig_block_size,
            use_harris);


   int r=2; //rectangle size
   int lineWidth=1; // rectangle line width
   //-----draw good feature corners on the original RGB image---------
   for (int i=0;i<corner_count;i++){
      cvRectangle(imgRGB2, cvPoint(corners[i].x-r,corners[i].y-r), 
            cvPoint(corners[i].x+r,corners[i].y+r), cvScalar(255,0,0),lineWidth);
   }
   
   int half_win_size=3;//the window size will be 3+1+3=7
   int iteration=20;
   double epislon=0.1; 
   cvFindCornerSubPix(
         imgGrey,
         corners,
         corner_count,
         cvSize(half_win_size,half_win_size),
         cvSize(-1,-1),//no ignoring the neighbours of the center corner
         cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,iteration,epislon)
   );

   //------draw subpix corners on another original RGB image------------
   for (int i=0;i<corner_count;i++){
      cvRectangle(imgRGB, cvPoint(corners[i].x-r,corners[i].y-r), 
            cvPoint(corners[i].x+r,corners[i].y+r), cvScalar(0,0,255),lineWidth);
   }
   
   //to display a coordinate of the third corner
   cout<<"x="<<corners[2].x;
   cout<<",y="<<corners[2].y<<endl;

   cvNamedWindow("cvFindCornerSubPix", CV_WINDOW_AUTOSIZE );
   cvShowImage( "cvFindCornerSubPix", imgRGB );
   cvNamedWindow("cvGoodFeaturesToTrack", CV_WINDOW_AUTOSIZE );
   cvShowImage( "cvGoodFeaturesToTrack", imgRGB2 );
   

   cvWaitKey(0); 
   cvReleaseImage(&imgGrey);
   cvReleaseImage(&imgRGB);
   cvReleaseImage(&imgRGB2);
   cvDestroyWindow("cvGoodFeaturesToTrack");
   cvDestroyWindow("cvFindCornerSubPix");

   //char c=getchar();
   return 0;
}



 


 

result:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值