opencv 3,blobdetection,功能/特征未实现()在detectAndCompute
Posted
技术标签:
【中文标题】opencv 3,blobdetection,功能/特征未实现()在detectAndCompute【英文标题】:opencv 3, blobdetection, The function/feature is not implemented () in detectAndCompute 【发布时间】:2015-08-17 19:02:38 【问题描述】:我对 opencv 3 有疑问: 我想使用一个特征检测器 SimpleBlobDetector,即将使用凸度和圆度过滤器。 但是当我尝试执行代码时,会跟踪到以下错误:
detectAndCompute中没有实现函数/特性()
然后应用程序崩溃。
我在互联网上搜索信息没有任何相关答案。 我认为 Opencv 的第 3 版可能是造成此错误的原因,因为我知道我使用检测器的方式很好(我完全按照 opencv 官方教程进行了尝试),并且我注意到 SimpleBlobDector 已针对第三版进行了修改。
使用断点,我知道以下行崩溃:
detector.detect(灰色,关键点);
SimpleBlobDetector 已创建(使用 create 函数)并配置好,灰度图像不为空,检测前无需填充关键点向量。
我使用 opencv 3.0.0,在 MinGW 中用 QtCreator 编译。 opencv处理不是从主线程启动的。
其他人有同样的问题吗? 如果我可以使用其他类提供补丁或其他解决方案,我将不胜感激。我真的需要使用凸度来过滤我的斑点,而我发现的其他检测器(FeatureDetector 或 Brisk)无法配置,只能返回没有面积或丰满度参数来计算凸度的关键点。
提前致谢
【问题讨论】:
你可以分享一些代码吗?你的图像有多大?对我来说,它适用于 OpenCV 3.0.0 - 你构建了哪个版本? Github 还是测试版? 【参考方案1】:只使用detect(...) 而不是detectAndCompute(...)。没有为 blob 检测定义特征描述符。
请看这里: https://***.com/a/11079868/1611317
【讨论】:
事实并非如此——正如 OP 所说,崩溃发生在detector.detect(…)
行。【参考方案2】:
感谢您的回复。
我使用检测(就像我在之前的消息中所说的那样)。我认为检测功能可能使用了detectAndCompute。
缺少描述符确实是问题所在,因为我已经遇到了与 Emgu(opencv 的 C# 版本)类似的问题,直到我发现一个开发人员说明说该方法尚未更正并且描述符是原因.
对于其他有同样问题的人,我最终使用了 cv::findContours 而不是 blob 检测器。它工作得更好,没有任何问题。 要替换凸度检测,可以使用丰满度(形状区域/边界框区域)对其进行评估。要替换圆形度,请使用以下公式:
圆形区域/边界框区域 = PI/4
我希望这会希望其他人。
【讨论】:
【参考方案3】:这看起来已经解决了,但也许它可以帮助其他人。我有同样的问题。我创建了这样的斑点检测器:
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 );
现在一切正常。
这真的很奇怪,如果有人知道为什么会这样工作,请告诉我。
【讨论】:
【参考方案4】:这是因为您使用的是 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);
如果你有参数。
【讨论】:
你需要使用Ptr<SimpleBlobDetector>
,原始指针会立即“杀死自己”以上是关于opencv 3,blobdetection,功能/特征未实现()在detectAndCompute的主要内容,如果未能解决你的问题,请参考以下文章
为啥 OpenCV 3.0 beta 中的对象检测删除了尺度级联和精明修剪功能?