视觉opencv Fast代码

学习参考链接

利用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
};

最后得到的结果如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值