赞
踩
在使用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没有勾选,或者说扩展模块没有增加.
好的,于是我按照教程全部完成之后报错位置和原因一点没变.
没办法继续找解决方案;
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对象从而使用它.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。