I have a problem with opencv 3: I want to use a feature detector, SimpleBlobDetector, about to use filters by convexity and circularity. But when I try to execute the code, the
Thanks for the response.
I use detect (like I said in my previous message). I think the detect function probably uses detectAndCompute.
The lack of descriptor can be the problem indeed, because I already had an equivalent problem with Emgu (the C# version of opencv) until I found a developer note saying that the method wasn't corrected yet and the descriptor was the cause.
For others who have the same problem, I finally used cv::findContours instead of the blob detector. It works much better, without any problem. To replace the convexity detection, you can evaluate it using the fullness (shape area / bounding box area). To replace the circularity, use the following formula:
circle area / bounding box area = PI/4
I hope this will hope other people.
this looks like it is solved, but maybe it helps someone else. I had the same problem. I created blob detector like this:
cv::SimpleBlobDetector detector;
detector.create(params);
detector.detect( img, keypoints );
This ended up with error: The function/feature is not implemented () in detectAndCompute
.
But when I tried it like this:
cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params);
detector->detect( img, keypoints );
Now everything works as expected.
It is really strange and if anyone knows why is working like that let me know please.
This is because you're using OpenCV 3.X, where (as of this writing) all of the examples you'll find online use OpenCV 2.X.
If you dig around, though, you'll find the transition guide: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html#tutorial_transition_hints_headers
Which says you need to use:
Ptr<SomeAlgo> algo = makePtr<SomeAlgo>(...);
Ptr<SomeAlgo> algo = SomeAlgo::create(...);
Instead of:
SomeAlgo algo(); // bad
So in this case, you'll need to use:
Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create();
Or:
Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create(params);
If you've got params.
Just use detect(...) and not detectAndCompute(...). There is no feature descriptor defined for blob detection.
See here: https://stackoverflow.com/a/11079868/1611317