OpenCV3.3 & VS2015的配置 + Feature Detectors


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.youkuaiyun.com/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);
}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值