2015-06-03 4 views
7

Ich habe ein Problem mit opencv 3: Ich möchte einen Feature-Detektor verwenden, SimpleBlobDetector, um Filter durch Konvexität und Kreisförmigkeit zu verwenden. Aber wenn ich versuche, den Code auszuführen, wird der folgende Fehler aufgespürt:opencv 3, blobdetection, Die Funktion/Feature ist nicht implementiert() in detectAndCompute

The function/feature is not implemented() in detectAndCompute

dann die Anwendung abstürzt.

Ich suchte nach Informationen im Internet ohne irgendeine relevante Antwort. Ich denke, dass die dritte Version von Opencv für diesen Fehler verantwortlich sein könnte, weil ich weiß, dass ich den Detektor auf die gute Weise benutze (ich habe es genau wie das offizielle opencv Tutorial versucht) und bemerkte, dass der SimpleBlobDector für die dritte Version modifiziert wurde.

Breakpoint verwenden, weiß ich, dass die folgende Zeile stürzt:

detector.detect(gray, keypoints);

Die SimpleBlobDetector erstellt wurde (die Funktion erstellen verwenden) und konfiguriert, das graue Bild nicht leer ist und der keypoints Vektor braucht nicht vor der Erkennung gefüllt werden.

Ich benutze opencv 3.0.0, kompiliert in MinGW mit QtCreator. Die opencv-Behandlung wird nicht vom Hauptthread gestartet.

Hat jemand anderes das gleiche Problem? Ich wäre dankbar, wenn ich einen Patch oder eine andere Lösung mit einer anderen Klasse haben könnte. Ich muss wirklich Konvexität verwenden, um meine Blobs zu filtern, und die anderen Detektoren, die ich fand (FeatureDetector oder Brisk), können nicht konfigurierbar sein und geben nur Keypoints zurück, die keine Flächen- oder Fülle-Parameter zur Berechnung der Konvexität haben.

Vielen Dank im Voraus

+0

Können Sie etwas Code teilen? Wie groß ist dein Bild? Für mich funktioniert es in OpenCV 3.0.0 - Welche Version hast du gebaut? Github oder Beta? – Viatorus

Antwort

0

Verwenden Sie einfach erkennen (...) und nicht detectAndCompute (...). Für die Blob-Erkennung ist kein Funktionsdeskriptor definiert.

Siehe hier: https://stackoverflow.com/a/11079868/1611317

+0

Dies ist nicht der Fall - OP stürzt ab, der Absturz befindet sich auf der Zeile 'detector.detect (...)'. –

1

Vielen Dank für die Antwort.

Ich benutze erkennen (wie ich in meiner vorherigen Nachricht sagte). Ich denke, die Erkennungsfunktion verwendet wahrscheinlich detectAndCompute.

Das Fehlen von Deskriptor kann das Problem in der Tat sein, weil ich bereits ein gleichwertiges Problem mit Emgu hatte (die C# -Version von opencv), bis ich eine Entwickler-Notiz fand, dass die Methode noch nicht korrigiert wurde und der Deskriptor der war Ursache.

Für andere, die das gleiche Problem haben, habe ich endlich cv :: findContours anstelle des Blobdetektors verwendet. Es funktioniert viel besser, ohne Probleme. Um die Konvexitätserkennung zu ersetzen, können Sie sie anhand der Fülle (Formbereich/Bounding Box-Bereich) auswerten. Um die Zirkularität zu ersetzen, verwenden Sie die folgende Formel:

circle area/bounding box area = PI/4

Ich hoffe, das wird andere Menschen Hoffnung.

11

sieht aus wie es gelöst ist, aber vielleicht hilft es jemand anderem. Ich hatte das gleiche Problem.Ich habe blob Detektor wie folgt aus:

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

Das mit Fehler endete: The function/feature is not implemented() in detectAndCompute.

Aber wenn ich es so versucht:

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

Jetzt funktioniert alles wie erwartet.

Es ist wirklich seltsam und wenn jemand weiß, warum funktioniert so, lass es mich bitte wissen.

11

Dies ist, weil Sie OpenCV 3.X verwenden, wo (zum Zeitpunkt des Schreibens) alle Beispiele, die Sie online finden, OpenCV 2.X verwenden.

Wenn Sie graben um, obwohl, werden Sie den Übergang Anleitung: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html#tutorial_transition_hints_headers

Welche sagt Sie verwenden müssen:

Ptr<SomeAlgo> algo = makePtr<SomeAlgo>(...); 
Ptr<SomeAlgo> algo = SomeAlgo::create(...); 

Statt:

SomeAlgo algo(); // bad 

So In diesem Fall müssen Sie Folgendes verwenden:

Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create(); 

Oder:

Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create(params); 

Wenn du hast params.

+1

Sie müssen 'Ptr ' verwenden, ein roher Zeiger wird sich sofort "töten" – berak

+0

Whoops, danke - behoben. –

Verwandte Themen