OpenCV 3,BlobDetection,“detectAndCompute”函数/功能未实现

13
我遇到了关于opencv 3的问题: 我想要使用一个特征检测器,SimpleBlobDetector,并希望用凸度和圆度来进行过滤。 但是当我尝试执行代码时,跟踪到了以下错误:
“在detectAndCompute中未实现函数/功能()”
然后应用程序崩溃了。
我在互联网上搜索了相关信息,但没有找到任何有效答案。 我认为Opencv的第3个版本可能会导致这个错误,因为我知道我已经按照官方教程正确使用了检测器,并且我注意到SimpleBlobDector已经针对第三个版本进行了修改。
使用断点,我知道以下行会导致崩溃:
“detector.detect(gray, keypoints);”
已创建SimpleBlobDetector(使用create函数)并进行了配置,灰度图像不为空,并且在检测之前无需填充keypoints向量。
我使用编译于MinGW与QtCreator的opencv 3.0.0。 Opencv处理未从主线程启动。
有人遇到过同样的问题吗? 如果可以提供修补程序或另一种使用另一个类的解决方案,我将不胜感激。我真的需要使用凸度来过滤我的斑点,并且我发现其他检测器(FeatureDetector或Brisk)无法配置并且只返回关键点,这些关键点没有面积或完整度参数来计算凸度。
谢谢您的帮助。

你能分享一些代码吗?你的图像有多大?对我来说,在OpenCV 3.0.0中可以工作 - 你构建的是哪个版本?Github还是Beta? - Viatorus
4个回答

21

看起来问题已经解决了,但也许会对其他人有所帮助。我曾经遇到过相同的问题。我是这样创建斑点探测器的:

cv::SimpleBlobDetector detector;
detector.create(params);
detector.detect( img, keypoints );

这导致出现错误:在detectAndCompute函数中,该功能/特性未实现()

但是当我像这样尝试时:

cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params); 
detector->detect( img, keypoints );

现在一切都如预期一样运作。

这真的很奇怪,如果有人知道为什么会这样工作,请告诉我。


16
这是因为您正在使用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);

如果您有参数。


1
你需要使用 Ptr<SimpleBlobDetector>,一个原始指针会立即“自杀”。 - berak

2

感谢您的回复。

我使用 detect(就像我在之前的消息中说的那样)。我认为 detect 函数可能使用 detectAndCompute。

缺少描述符可能确实是问题,因为我曾经用 Emgu(opencv 的 C# 版本)遇到过类似的问题,直到我找到开发者注释说该方法尚未修正,描述符是原因。

对于其他遇到相同问题的人,我最终使用了 cv::findContours 代替 blob 检测器。它运行得更好,没有任何问题。要替换凸度检测,可以使用完整性(形状面积 / 边界框面积)进行评估。要替换圆度,请使用以下公式:

圆形面积 / 边界框面积 = PI/4

我希望这会对其他人有所帮助。


0

1
这并不是事实——正如 OP 所述,崩溃发生在 detector.detect(…) 行。 - David Wolever

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接