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);
}
效果图:
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);
}
效果图:
相关文章推荐
- Leaning OpenCV:Corner Detection Using cvGoodFeaturesToTrack
- Leaning OpenCV:Corner Detection Using cvGoodFeaturesToTrack
- OpenCv目标跟踪_cvGoodFeaturesToTrack()寻找角点
- 【练习8.7】cvGoodFeaturesToTrack确定图像强角点、cvFindCornerSubPix亚像素级角点检测
- opencv例程之cvGoodFeaturesToTrack
- 第十章 跟踪与运动 opecv cvGoodFeaturesToTrack
- cvGoodFeaturesToTrack()设置ROI的问题
- cvgoodFeaturesToTrack函数详细注释
- OpenCv目标跟踪_cvGoodFeaturesToTrack()寻找角点
- 角点检测cvFindCornerSubPix和cvGoodFeaturesToTrack
- OpenCV:cvGoodFeaturesToTrack 和cvFindCorner特征点检测
- [learning opencv]第十章cvGoodFeaturesToTrack的demo
- 【OpenCV3】角点检测——cv::goodFeaturesToTrack()与cv::cornerSubPix()详解
- cvGoodFeaturesToTrack()与goodFeaturesToTrack()进行harris角点检测
- cvGoodFeaturesToTrack
- cvGoodFeaturesToTrack的解析与应用
- [learning opencv]第十章cvGoodFeaturesToTrack的demo
- Corner Detection Using cvGoodFeaturesToTrack
- goodFeaturesToTrack——Shi-Tomasi角点检测
- 检测实现OpenCV2.4.4实现Shi-Tomasi角点检测(goodFeaturesToTrack)