在使用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对象从而使用它.