c++ 使用opencv中SIFT类时使用函数detect报错问题

在使用SIFT::detect(gray,keypoint1)报错

OpenCV(3.4.16) Error: The function/feature is not implemented () in cv::Feature2D::detectAndCompute, file D:\OpenCV3.4\opencv3.4\sources\modules\features2d\src\feature2d.cpp, line 154

 

原始代码是这样的:

    Mat src;
	src = imread("tem.jpg");
	Mat gray = imread("tem.jpg", 0);
	SIFT detector;
	vector<KeyPoint> keypoint1;
	detector.detect(gray, keypoint1);

改为 

	Mat src;
	src = imread("tem.jpg");
	Mat gray = imread("tem.jpg", 0);
	vector<KeyPoint> keypoint1;
	Ptr <SIFT> detector = SIFT::create();
	detector->detect(gray,keypoint1);

 就可以正常调用detect函数.

 报错时通过堆栈我跟踪到这东西是跳转到Feature2D::detectAndCompute()

void Feature2D::detectAndCompute(InputArray, InputArray,
    std::vector<KeyPoint>&,
    OutputArray,
    bool)
{
    CV_INSTRUMENT_REGION();

    CV_Error(Error::StsNotImplemented, "");
}

好吧这个地方确实是没有实现但是网上用相同版本opencv的又可以使用SIFT,查了一天有说高版本下因为专利问题删除了,退回到3.2版本就可以.

于是我又去看了3.2版本的源码发现这个位置同样也是返回未实现警告;

这说明不是我版本问题;

其他的说法是cmake的时候OPENCV_ENABLE_NONFREE没有勾选,或者说扩展模块没有增加.

好的,于是我按照教程全部完成之后报错位置和原因一点没变.

没办法继续找解决方案;

最终我找到了这个OpenCV SIFT源码讲解——代码逻辑宏观窥探_opencv sift 源码_lessssssss的博客-CSDN博客z讲解OpenCV的SIFT源码_opencv sift 源码https://blog.csdn.net/less_stronger/article/details/127884582

 detectAndCompute是被SIFT_Impl重写,在SIFT_Impl实现,而这个SIFT_Impl是继承于SIFT.因此只能通过他自己的静态函数

CV_WRAP static Ptr<SIFT> create(int nfeatures = 0, int nOctaveLayers = 3,
        double contrastThreshold = 0.04, double edgeThreshold = 10,
        double sigma = 1.6);

static Ptr<SIFT> create这个函数它的实现在sift.dispatch.cpp中

Ptr<SIFT> SIFT::create( int _nfeatures, int _nOctaveLayers,
                     double _contrastThreshold, double _edgeThreshold, double _sigma )
{
    CV_TRACE_FUNCTION();

    return makePtr<SIFT_Impl>(_nfeatures, _nOctaveLayers, _contrastThreshold, _edgeThreshold, _sigma, CV_32F);
}

得到它的子类SIFT_Impl对象从而使用它.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值