Opencv2 computer vision application programming cookbook<七>

来源:互联网 发布:网络播放器怎么安装 编辑:程序博客网 时间:2024/06/07 01:09

第8章介绍检测并匹配兴趣点

主要包括Harris,FAST,SURF以及SURF特征描述子

// OpencvCorner.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include<iostream>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp>
//#include <opencv2/features2d/features2d.hpp>


#include <opencv2/nonfree/features2d.hpp>
#include <opencv2/nonfree/nonfree.hpp>
using namespace std;
using namespace cv;

class HarrisDetector
{
private:
//表示角点强度的32位浮点图像
Mat cornerStrength;
//表示阈值化后角度的32位浮点图像
Mat cornerTh;
//局部极大值图像(内部)
Mat localMax;
//导数平滑的相邻像素的尺寸
int neighbourhood;
//梯度计算的孔径大小
int aperture;
//Harris参数
double k;
//阈值计算的最大强度
double maxStrength;
//计算得到 的阈值(内部)
double thresh;
//非极大值抵制的相邻像素的尺寸
int nonMaxSize;
//非极大值抵制的核
Mat kernel;
public:
HarrisDetector():neighbourhood(3),aperture(3),k(0.01),maxStrength(0.0),thresh(0.01),nonMaxSize(3)
{
//创建非极大值抵制的核
SetLocalMaxWindowSize(nonMaxSize);
}
// 创建非极大值抵制的核
void SetLocalMaxWindowSize(int size) 
{
 nonMaxSize= size;
 kernel.create(nonMaxSize,nonMaxSize,CV_8U);
 }
//计算Harris角点
void detect(const Mat & image)
{
//Harris计算
cornerHarris(image,cornerStrength,neighbourhood,aperture,k);
//内部阈值计算
double minStrength;//未使用
minMaxLoc(cornerStrength,&minStrength,&maxStrength);
//局部极大值检测
Mat dilated;//临时图像
dilate(cornerStrength,dilated,Mat());
compare(cornerStrength,dilated,localMax,CMP_EQ);
}


//由Harris值获取角点图像
Mat GetCornerMap(double qualityLevel)
{
Mat cornerMap;


//对角点图像进行阈值化
thresh=qualityLevel*maxStrength;
threshold(cornerStrength,cornerTh,thresh,255,THRESH_BINARY);
//转换为8位图像
cornerTh.convertTo(cornerMap,CV_8U);
//非极大值抑制
bitwise_and(cornerMap,localMax,cornerMap);
return cornerMap;


}


//由Harris值得到特征点
void GetCorners(vector<Point> & points,double qualityLevel)
{
//得到角点图
Mat cornerMap=GetCornerMap(qualityLevel);
//得到角点
GetCorners(points,cornerMap);
}


//由角点图获取特征点
void GetCorners(vector<Point> & points,Mat & cornerMap)
{
//遍历像素得到所有特征
for(int y=0;y<cornerMap.rows;y++)
{
const uchar * rowPtr=cornerMap.ptr<uchar>(y);
for(int x=0;x<cornerMap.cols;x++)
{
//如果是特征点
if(rowPtr[x])
{
points.push_back (Point(x,y));
}
}
}
}


//在特征点的位置绘制圆
void DrawOnImage(Mat & image,const vector<Point> & points,Scalar color=Scalar(0,0,255),int radius=3,int thickness=2)
{
vector<Point>::const_iterator it=points.begin();
while(it!=points.end())
{
circle(image,*it,radius,color,thickness);
++it;

}
}


};


int _tmain(int argc, _TCHAR* argv[])
{

//Mat image=imread("church01.jpg",0);
//Mat corner;
//cornerHarris(image,corner,
// 3,//相邻像素的尺寸
// 3,//滤波器的孔径大小
// 0.01);//Harris参数


////角点强度的阈值
//Mat harrisConrners;
//double thresh=0.0001;
//threshold(corner,harrisConrners,thresh,255,THRESH_BINARY_INV);


//imshow("image",harrisConrners);


////Harris检测
//Mat image=imread("church01.jpg",0);
////创建Harris检测器的对象
//HarrisDetector harris;
////计算Harris值
//harris.detect(image);
////检测Harris角点
//vector<Point> pts;
//harris.GetCorners(pts,0.01);
////绘制Harris角点
//harris.DrawOnImage(image,pts);
//imshow("",image);


////Harris检测
//Mat image=imread("church01.jpg",0);
//vector<Point2f> corners;
//goodFeaturesToTrack(image,corners,500,0.01,10);
////特征点向量
//vector<KeyPoint> keyPoints;
////检测器的构造函数
//GoodFeaturesToTrackDetector gftt(
// 500,//返回最大特征点数目
// 0.01,//质量等级
// 10);//两点之间的最小允许距离
////使用FeatureDetector的函数进行检测
//gftt.detect(image,keyPoints);


//drawKeypoints(image,//原始图像
//keyPoints,//特征点向量
//image,//输出图像
//Scalar(0,0,255),//特征点颜色
//DrawMatchesFlags::DRAW_OVER_OUTIMG);//绘制标记
//imshow("image",image);


////检测FAST角点
//Mat image=imread("church01.jpg",1);
//vector<KeyPoint> keyPoints;
//FastFeatureDetector fast(40);
//fast.detect(image,keyPoints);
//drawKeypoints(image,//原始图像
// keyPoints,//特征点向量
// image,//输出图像
// Scalar(0,0,255),//特征点颜色
// DrawMatchesFlags::DRAW_OVER_OUTIMG);//绘制标记
//imshow("image",image);


// 检测SURF角点
Mat image=imread("church01.jpg",1);
vector<KeyPoint> keyPoints;
//注意:SurfFeatureDetector声明已经换地方了
//应该引用以下两个文件:
//#include <opencv2/nonfree/features2d.hpp>
//#include <opencv2/nonfree/nonfree.hpp>
SurfFeatureDetector surf(2500.);
surf.detect(image,keyPoints);
drawKeypoints(image,//原始图像
keyPoints,//特征点向量
image,//输出图像
Scalar(0,0,255),//特征点颜色
DrawMatchesFlags::DRAW_OVER_OUTIMG);//绘制标记
imshow("image",image);
////特征点描述符
//SurfDescriptorExtractor surfDesc;
//Mat descriptors1;
//surfDesc.compute (image,keypoints1,descriptors1);


////构造匹配器
//BruteForceMatcher<L2<flost>> matcher;
////匹配两幅图像的描述子
////DMatch向量,表示一对匹配的描述子
//vector<DMatch> matches;
//matcher.match(descriptors1,descriptors2,matches);
////nth_element将第n个元素按照顺序方式放置在第n个位置
////所有小于它的元素都位于它之前,然后向量中剩余的元素被移除
//nth_element(matches.begin(),//初始位置
// matches.begin()+24,//排序元素的位置
// matches.end());//终止位置
////移除第25位之后的所有元素
//matches.erase(matches.begin()+25,matches.end());


//Mat imageMatches;
//drawMatches(
// image1,keypoints1,//第一幅图像及其特征点
// image2,keypoints2,//第二幅图像及其特征点
// matches,//匹配结果
// imageMatches,//生成的图像
// Scalar(0,0,255));//直线的颜色


//imshow("image",image);


//测试部分
//Mat image=imread("church01.jpg",0);
//Mat cornerStrength;
//cornerHarris(image,cornerStrength,
// 3,//相邻像素的尺寸
// 3,//滤波器的孔径大小
// 0.05);//Harris参数 Det(C)-k*Trace^2(C)
////角点强度的阈值
////imshow("cornerStrength",cornerStrength);
//Mat harrisConrners;
//double thresh=0.0001;
//threshold(cornerStrength,harrisConrners,thresh,255,THRESH_BINARY_INV);


//imshow("harrisConrners",harrisConrners);
////内部阈值计算
//double minStrength;//未使用
//double maxStrength;
//minMaxLoc(cornerStrength,&minStrength,&maxStrength);
////局部极大值检测
//Mat dilated;//临时图像
//dilate(harrisConrners,dilated,Mat());
//imshow("dilated",dilated);
//Mat localMax;
//compare(harrisConrners,dilated,localMax,CMP_EQ);
//imshow("localMax",localMax);


waitKey();
return 0;
}


0 0
原创粉丝点击