您的位置:首页 > Web前端

cvGoodFeaturesToTrack和(CV::Mat 下的goodFeaturesToTrack)

2014-05-28 17:39 519 查看
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
plaincopy

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

using namespace cv;

using namespace std;

//全局变量

Mat src1, src1_gray,

src2, src2_gray;

int maxCorners = 23;

int maxTrackbar = 100;

char* source_window1 = "src1";

char* source_window2 = "src2";

void goodFeaturesToTrack_Demo( int, void* )

{

//参数初始化

if(maxCorners < 1)//允许返回的最多角点个数

maxCorners = 1;

vector<Point2f> corners1,corners2;//角点容器

double qualityLevel = 0.01;//最小特征值小于qualityLevel*最大特征值的点将被忽略

double minDistance = 10;//两角点间最小距离

int blockSize = 3;//邻域尺寸

bool useHarrisDetector = false;//是否使用Harris

double k = 0.04;

//拷贝原图

Mat src1_copy = src1.clone();

Mat src2_copy = src2.clone();

//调用函数进行Shi-Tomasi角点检测

goodFeaturesToTrack( src1_gray,

corners1,

maxCorners,

qualityLevel,

minDistance,

Mat(),

blockSize,

useHarrisDetector,

k );

goodFeaturesToTrack( src2_gray,

corners2,

maxCorners,

qualityLevel,

minDistance,

Mat(),

blockSize,

useHarrisDetector,

k );

//画出角点

cout<<"角点个数:"<<corners1.size()<<endl;//等于maxCorners

for( int i = 0; i < corners1.size(); i++ )

{

circle( src1_copy, corners1[i], 4, Scalar(0,255,0),2);

circle( src2_copy, corners2[i], 4, Scalar(0,255,0),2);

}

//显示图像

imshow( source_window1, src1_copy );

imshow( source_window2, src2_copy );

}

int main()

{

//加载源图并转换为灰度图

src1 = imread("horse1.jpg");

src2 = imread("horse2.jpg");

cvtColor( src1, src1_gray, CV_BGR2GRAY );

cvtColor( src2, src2_gray, CV_BGR2GRAY );

//创建窗口

namedWindow( source_window1, CV_WINDOW_AUTOSIZE );

namedWindow( source_window2, CV_WINDOW_AUTOSIZE );

//创建滑块条,调节允许的角点个数

createTrackbar( "角点个数:", source_window1, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo );

goodFeaturesToTrack_Demo( 0, 0 );

waitKey(0);

return(0);

}

效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: