利用OpenCV提取图像中的特征点,提取出来的特征点为后面进行特征匹配做准备
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <vector>
using namespace cv;
void main()
{
Mat image;
image = imread("luffy.jpg");
// vector of keyPoints
std::vector<KeyPoint> keyPoints; //创建一个KeyPoint的数组,用来存放提取出来的特征点
// construction of the fast feature detector object
Ptr<FastFeatureDetector> de = FastFeatureDetector::create(90); //PTR是OpenCV中使用的只能指针
de->detect(image, keyPoints);
drawKeypoints(image, keyPoints, image, Scalar::all(255), DrawMatchesFlags::DRAW_OVER_OUTIMG);
imshow("FAST feature", image);
cvWaitKey(0);
}
与参考链接中不同点在于:
FastFeatureDetector fast(40); // 检测的阈值为40
// feature point detection
fast.detect(image,keyPoints);
替换为:
Ptr<FastFeatureDetector> de = FastFeatureDetector::create(90); //PTR是OpenCV中使用的只能指针
de->detect(image, keyPoints);
原来的链接中代码会出现如下错误:
错误 C2259 “cv::FastFeatureDetector”: 不能实例化抽象类 ConsoleApplication1 C:\Users\32047\source\repos\fun\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.cpp 16
这是因为opencv版本不同,创建方法发生了变化。
FastFeatureDetector:
class CV_EXPORTS_W FastFeatureDetector : public Feature2D
{
public:
enum
{
TYPE_5_8 = 0, TYPE_7_12 = 1, TYPE_9_16 = 2,
THRESHOLD = 10000, NONMAX_SUPPRESSION=10001, FAST_N=10002,
};
CV_WRAP static Ptr<FastFeatureDetector> create(
int threshold=10,bool nonmaxSuppression=true,int type=FastFeatureDetector::TYPE_9_16
);
CV_WRAP virtual void setThreshold(int threshold) = 0;
CV_WRAP virtual int getThreshold() const = 0;
CV_WRAP virtual void setNonmaxSuppression(bool f) = 0;
CV_WRAP virtual bool getNonmaxSuppression() const = 0;
CV_WRAP virtual void setType(int type) = 0;
CV_WRAP virtual int getType() const = 0;
};
这其中,使用到的Ptr,说明如下:
//OpenCV中使用的智能指针。类似于std::smart_ptr,但是在OpenCV中可以用Ptr轻松管理各种类型的指针。
//可以用Ptr ptr代替MyObjectType* ptr,MyObjectType可以是C的结构体或C++的类,
//如果没有自动析构的函数,需要实现
//template<> void Ptr::delete_obj() { call_destructor_func(obj); }
//如果C++类中有析构函数,可以不用实现。
template<typename _Tp> class Ptr
{
public:
//! empty constructor
Ptr();
//! take ownership of the pointer. The associated reference counter is allocated and set to 1
Ptr(_Tp* _obj);
//! calls release()
~Ptr();
//! copy constructor. Copies the members and calls addref()
Ptr(const Ptr& ptr);
template<typename _Tp2> Ptr(const Ptr<_Tp2>& ptr);
//! copy operator. Calls ptr.addref() and release() before copying the members
Ptr& operator = (const Ptr& ptr);
//! increments the reference counter
void addref();
//! decrements the reference counter. If it reaches 0, delete_obj() is called
void release();
//! deletes the object. Override if needed
void delete_obj();
//! returns true iff obj==NULL
bool empty() const;
//! cast pointer to another type
template<typename _Tp2> Ptr<_Tp2> ptr();
template<typename _Tp2> const Ptr<_Tp2> ptr() const;
//! helper operators making "Ptr<T> ptr" use very similar to "T* ptr".
_Tp* operator -> ();
const _Tp* operator -> () const;
operator _Tp* ();
operator const _Tp*() const;
_Tp* obj; //< the object pointer.
int* refcount; //< the associated reference counter
};
最后得到的结果如下: