1.OpenCV3.3 + Visual Studio 2015 配置教程:
https://www.cnblogs.com/zangdalei/p/5339316.html
这版就够了,不过他的OpenCV是3.1版本的,在Linker那部分需要把.lib文件的310改成330。
2.FAST 特征
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <cv.h>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("a.png");//图片必须添加到工程目录下
// FAST
vector<KeyPoint> fast_keypoints;
FAST(img, fast_keypoints, 20, true); //threshold=20,nonMaxSuppression=true
Mat fast_points;
drawKeypoints(img, fast_keypoints, fast_points, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
//namedWindow("Original");
imshow("Original", img);
//namedWindow("FAST");
imshow("FAST", fast_points);
waitKey(0);
destroyAllWindows();
return 0;
}
这里遇到了一个小插曲。。。。waitKey()函数不起作用,总是直接跳过这个语句然后destroy所有window,图片总是加载不出来,应该不是原理上哪里出错了,以前也遇到过这种情况,这个时候从新建一个Project就好辣。 :)
3.ORB特征
转自:http://blog.csdn.net/bingoplus/article/details/60133565
网上确实很多教程都会在用ORB时写成
ORB orb;
OpenCV3上是一定会报错的:
'cv::ORB':cannot instantiate abstract class
在features2d模块中可以发现ORB定义为一个纯虚类。
class CV_EXPORTS_W ORB : public Feature2D
{
public:
enum { kBytes = 32, HARRIS_SCORE=0, FAST_SCORE=1 };
CV_WRAP static Ptr<ORB> create(int nfeatures=500, float scaleFactor=1.2f, int nlevels=8, int edgeThreshold=31,
int firstLevel=0, int WTA_K=2, int scoreType=ORB::HARRIS_SCORE, int patchSize=31, int fastThreshold=20);
CV_WRAP virtual void setMaxFeatures(int maxFeatures) = 0;
CV_WRAP virtual int getMaxFeatures() const = 0;
CV_WRAP virtual void setScaleFactor(double scaleFactor) = 0;
CV_WRAP virtual double getScaleFactor() const = 0;
CV_WRAP virtual void setNLevels(int nlevels) = 0;
CV_WRAP virtual int getNLevels() const = 0;
CV_WRAP virtual void setEdgeThreshold(int edgeThreshold) = 0;
CV_WRAP virtual int getEdgeThreshold() const = 0;
CV_WRAP virtual void setFirstLevel(int firstLevel) = 0;
CV_WRAP virtual int getFirstLevel() const = 0;
CV_WRAP virtual void setWTA_K(int wta_k) = 0;
CV_WRAP virtual int getWTA_K() const = 0;
CV_WRAP virtual void setScoreType(int scoreType) = 0;
CV_WRAP virtual int getScoreType() const = 0;
CV_WRAP virtual void setPatchSize(int patchSize) = 0;
CV_WRAP virtual int getPatchSize() const = 0;
CV_WRAP virtual void setFastThreshold(int fastThreshold) = 0;
CV_WRAP virtual int getFastThreshold() const = 0;
};
纯虚类是什么?https://www.2cto.com/kf/201508/427179.html
只要有一个纯虚函数就为纯虚类;
如果子类没有实现纯虚函数,相当子类也有纯虚函数,所以子类也是纯虚类;
但是虚类不可以定义一个对象,只能作为基类来使用,类似Java中的接口。
所以ORB应该怎么用呢
CV_WRAP static Ptr<ORB> create(int nfeatures=500, float scaleFactor=1.2f, int nlevels=8, int edgeThreshold=31,
int firstLevel=0, int WTA_K=2, int scoreType=ORB::HARRIS_SCORE, int patchSize=31, int fastThreshold=20);
使用C++的新特性,智能指针Ptr,解决了动态释放内存的问题。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <iostream>
#include <vector>
#include "Header.h"
using namespace cv;
using namespace std;
void ORBfeature()
{
Mat img_1 = imread("a.png");
Mat img_2 = imread("a1.JPG");
// -- Step 1: Detect the keypoints using STAR Detector
std::vector<KeyPoint> keypoints_1, keypoints_2;
Ptr<ORB> orb = ORB::create();
orb->detect(img_1, keypoints_1);
orb->detect(img_2, keypoints_2);
// -- Stpe 2: Calculate descriptors (feature vectors)
Mat descriptors_1, descriptors_2;
orb->compute(img_1, keypoints_1, descriptors_1);
orb->compute(img_2, keypoints_2, descriptors_2);
/*也可以直接用detectAndCompute将前两步合成一步
orb->detectAndCompute(img_1, Mat(), keypoints_1, descriptors_1);
orb->detectAndCompute(img_2, Mat(), Keypoints_2, descriptors_2);*/
//-- Step 3: Matching descriptor vectors with a brute force matcher
BFMatcher matcher(NORM_HAMMING);
std::vector<DMatch> mathces;
matcher.match(descriptors_1, descriptors_2, mathces);
// -- dwaw matches
Mat img_mathes;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, mathces, img_mathes);
// -- show
imshow("Mathces", img_mathes);
//waitKey(0);
}