cvGoodFeaturesToTrack和(CV::Mat 下的goodFeaturesToTrack)

本文档展示了如何使用OpenCV库中的goodFeaturesToTrack函数进行Shi-Tomasi角点检测。通过调整滑动条,可以设置最大角点个数,并在两幅图像中实时显示检测到的角点。代码包括图像读取、灰度转换、角点检测和画点显示等步骤。
摘要由CSDN通过智能技术生成

bool xor_match( Mat sub_mat, Mat template_image);
int main(void)
{
int cornersCount=MAX_CORNERS;
CvPoint2D32f corners[MAX_CORNERS];
IplImage *srcImage = 0,*grayImage = 0,*corners1 = 0,*corners2 = 0;
int i;
CvScalar color = CV_RGB(255,0,0);
cvNamedWindow("image",1);
cv::Mat patch[4];
patch[0]=cv::imread(filename0);
patch[1]=cv::imread(filename1);
patch[2]=cv::imread(filename2);
patch[3]=cv::imread(filename3);
//Load the image to be processed
srcImage = cvLoadImage(filename);
grayImage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,1);


//copy the source image to copy image after converting the format


cvCvtColor(srcImage,grayImage,CV_BGR2GRAY);


//create empty images os same size as the copied images


corners1 = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F,1);
corners2 = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F,1);
cvGoodFeaturesToTrack(grayImage,corners1,corners2,corners,&cornersCount,0.01,40,0,3,0,0.4);
printf("num corners found: %d\n",cornersCount);
cv::Mat src_gray(grayImage);
cv::Mat src_dst;
cv::Mat patch_gray;
cv::Mat patch_dst;
cv::threshold(src_gray,src_dst,200,1,CV_THRESH_BINARY);
if (cornersCount>0)
{
for (i=0;i<cornersCount;i++)
{
for (int m=0;m<4;m++)
{
cv::cvtColor(patch[i],patch_gray,CV_RGB2GRAY);
try
{
cv::threshold(patch_gray,patch_dst,200,1,CV_THRESH_BINARY);
cvCircle(srcImage,cvPoint((int)(corners[i].x),(int)(corners[i].y)),2,color,2,CV_AA,0);


//CvMat * pMat = cvCreateMatHeader(patch[m].rows, patch[m].cols, CV_8UC1);  //create a matrix's head
int rect_x=corners[i].x-(int)(patch[m].cols/2);
int rect_y=corners[i].y-(int)(patch[m].rows/2);
if (rect_x<0&&rect_y<0)
{
std::cout<<"这个角点不是待匹配的"<<std::endl;
}
else
{
cv::Rect rect = cvRect(rect_x,rect_y,patch[m].cols,patch[m].rows);  //To the interception of the area, and created the size of the matrix.
/* CvMat * subsouImage_mat=cvGetSubRect(srcImage, pMat, rect);*/
cv::Mat  Mat_srcImage(srcImage);
cv::Mat sub_mat=Mat_srcImage(rect).clone();
/* cv::Mat sub_mat=cv::Mat(subsouImage_mat,true);*/
bool flag=xor_match(sub_mat,patch[m]);
if (flag)

printf("Match the pictures successful,which location is (%d,%d)\n",(int)(corners[i].x),(int)(corners[i].y));
cv::Point pt1,pt2;
pt1=corners[i];
pt2=cv::Point((int)corners[i].x+patch[m].cols ,(int)corners[i].y + patch[m].rows);
cvRectangle(srcImage,pt1,pt2,CV_RGB(255,0,0),1);
}
}
}
catch (cv::Exception& e)
{
const char* err_msg = e.what();
std::cout << "exception caught: "<< err_msg<< std::endl;
}
}
}
}
cvShowImage("image",srcImage);
cvSaveImage("imagedst.png",srcImage);
cvReleaseImage(&srcImage);
cvReleaseImage(&grayImage);
cvReleaseImage(&corners1);
cvReleaseImage(&corners2);
cvWaitKey(0);
return 0;
}


bool xor_match( Mat sub_mat, Mat template_image)
{
cv::Point arOutPut;
/*Matrix is the same size as the template  by interception, then use XOR's method to match the image*/
cv::Mat dst;
cv::bitwise_xor(sub_mat,template_image,dst);
/*cv::bitwise_xor((InputArray)pMat,template_image,dst);*/
int num= cv::countNonZero( dst );//Statistics the number of non zero
if (num==0)//If the number of non zero is 0, that is to say the match success
{
return true;
}
return false;
}

#endif



[cpp]  view plain copy
  1. #include "opencv2/highgui/highgui.hpp"  
  2. #include "opencv2/imgproc/imgproc.hpp"  
  3. #include <iostream>  
  4. #include <stdio.h>  
  5. #include <stdlib.h>  
  6.   
  7. using namespace cv;  
  8. using namespace std;  
  9.   
  10. //全局变量  
  11. Mat src1, src1_gray,  
  12.     src2, src2_gray;  
  13.   
  14. int maxCorners = 23;  
  15. int maxTrackbar = 100;  
  16.   
  17. char* source_window1 = "src1";  
  18. char* source_window2 = "src2";  
  19.   
  20.   
  21. void goodFeaturesToTrack_Demo( intvoid* )  
  22. {  
  23.     //参数初始化  
  24.     if(maxCorners < 1)//允许返回的最多角点个数  
  25.         maxCorners = 1;  
  26.     vector<Point2f> corners1,corners2;//角点容器  
  27.     double qualityLevel = 0.01;//最小特征值小于qualityLevel*最大特征值的点将被忽略  
  28.     double minDistance = 10;//两角点间最小距离  
  29.     int blockSize = 3;//邻域尺寸  
  30.     bool useHarrisDetector = false;//是否使用Harris  
  31.     double k = 0.04;  
  32.   
  33.     //拷贝原图  
  34.     Mat src1_copy = src1.clone();  
  35.     Mat src2_copy = src2.clone();  
  36.   
  37.     //调用函数进行Shi-Tomasi角点检测  
  38.     goodFeaturesToTrack( src1_gray,  
  39.                          corners1,  
  40.                          maxCorners,  
  41.                          qualityLevel,  
  42.                          minDistance,  
  43.                          Mat(),  
  44.                          blockSize,  
  45.                          useHarrisDetector,  
  46.                          k );  
  47.     goodFeaturesToTrack( src2_gray,  
  48.                          corners2,  
  49.                          maxCorners,  
  50.                          qualityLevel,  
  51.                          minDistance,  
  52.                          Mat(),  
  53.                          blockSize,  
  54.                          useHarrisDetector,  
  55.                          k );  
  56.   
  57.   
  58.     //画出角点  
  59.     cout<<"角点个数:"<<corners1.size()<<endl;//等于maxCorners  
  60.     forint i = 0; i < corners1.size(); i++ )  
  61.     {  
  62.         circle( src1_copy, corners1[i], 4, Scalar(0,255,0),2);  
  63.         circle( src2_copy, corners2[i], 4, Scalar(0,255,0),2);  
  64.     }  
  65.   
  66.     //显示图像  
  67.     imshow( source_window1, src1_copy );  
  68.     imshow( source_window2, src2_copy );  
  69. }  
  70.   
  71. int main()  
  72. {  
  73.     //加载源图并转换为灰度图  
  74.     src1 = imread("horse1.jpg");  
  75.     src2 = imread("horse2.jpg");  
  76.     cvtColor( src1, src1_gray, CV_BGR2GRAY );  
  77.     cvtColor( src2, src2_gray, CV_BGR2GRAY );  
  78.   
  79.     //创建窗口  
  80.     namedWindow( source_window1, CV_WINDOW_AUTOSIZE );  
  81.     namedWindow( source_window2, CV_WINDOW_AUTOSIZE );  
  82.   
  83.     //创建滑块条,调节允许的角点个数  
  84.     createTrackbar( "角点个数:", source_window1, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo );  
  85.   
  86.     goodFeaturesToTrack_Demo( 0, 0 );  
  87.   
  88.     waitKey(0);  
  89.     return(0);  
  90. }  



效果图:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值