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&lt;SimpleBlobDetector&gt;,原始指针会立即“杀死自己”

以上是关于opencv 3,blobdetection,功能/特征未实现()在detectAndCompute的主要内容,如果未能解决你的问题,请参考以下文章

具有内置 CUDA 库/功能的 OpenCV-3

OpenCV 基础功能简介

为啥 OpenCV 3.0 beta 中的对象检测删除了尺度级联和精明修剪功能?

opencv3.3 安装环境教程以及实现个图片读取功能

如何在 Python 中使用 OpenCV 3.0 中的 HOG 功能训练 SVM 分类器?

OpenCV C++案例实战十《车牌号识别》