我遇到opencv 3的问题: 我想使用一个特征检测器SimpleBlobDetector,即将使用凸度和圆度的滤镜。 但是当我尝试执行代码时,会跟踪以下错误:
在detectAndCompute
中未实现函数/功能
然后应用程序崩溃。
我在网上搜索了没有相关答案的信息。 我认为第三版的Opencv可能会对这个错误负责,因为我知道我使用探测器的方式很好(我尝试的就像官方的opencv教程一样),我注意到SimpleBlobDector已被修改为第三个版本。
使用断点,我知道以下行崩溃了:
detector.detect(灰色,关键点);
SimpleBlobDetector已经创建(使用创建功能)并已配置,灰色图像不为空,并且在检测之前不需要填充关键点矢量。
我使用opencv 3.0.0,在MinGW中用QtCreator编译。 opencv处理不是从主线程启动的。
其他人有同样的问题吗? 如果我能使用其他课程获得补丁或其他解决方案,我将不胜感激。我真的需要使用凸度来过滤我的斑点,我发现的其他探测器(FeatureDetector或Brisk)不能配置,只返回关键点,没有面积或丰满度参数来计算凸度。
提前致谢
答案 0 :(得分:15)
这看起来已经解决了,但也许它可以帮助别人。我有同样的问题。我创建了这样的blob探测器:
cv::SimpleBlobDetector detector;
detector.create(params);
detector.detect( img, keypoints );
最终导致错误:The function/feature is not implemented () in detectAndCompute
。
但是当我尝试这样的时候:
cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params);
detector->detect( img, keypoints );
现在一切正常。
这真的很奇怪,如果有人知道为什么这样工作,请告诉我。
答案 1 :(得分:13)
这是因为您正在使用OpenCV 3.X,其中(在撰写本文时)您在网上找到的所有示例都使用OpenCV 2.X。
如果你四处寻找,你会找到过渡指南: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html#tutorial_transition_hints_headers
说你需要使用:
Ptr<SomeAlgo> algo = makePtr<SomeAlgo>(...);
Ptr<SomeAlgo> algo = SomeAlgo::create(...);
而不是:
SomeAlgo algo(); // bad
所以在这种情况下,你需要使用:
Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create();
或者:
Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create(params);
如果你有params。
答案 2 :(得分:2)
感谢您的回复。
我使用detect(就像我在上一条消息中所说的那样)。我认为detect函数可能使用detectAndCompute。
缺少描述符确实是问题所在,因为我已经遇到了与Emgu(opencv的C#版本)相同的问题,直到我找到一个开发人员注释说该方法尚未得到纠正且描述符为事业。
对于遇到同样问题的其他人,我最终使用了cv :: findContours而不是blob探测器。它运行得更好,没有任何问题。 要替换凸度检测,可以使用丰满度(形状区域/边界框区域)对其进行评估。要替换圆形度,请使用以下公式:
圆形区域/边界框区域= PI / 4
我希望这会希望其他人。
答案 3 :(得分:0)
只需使用detect(...)而不是detectAndCompute(...)。没有为blob检测定义功能描述符。