Ich arbeite an einem Robotik-Projekt mit einem Android-Handy als Hauptprozessor und der Kamera, um Bewegungen zu erkennen. Ich habe das Android-Binärpaket von OpenCV bekommen und es richtig installiert. Ich kann Bilder mit der nativen OpenCV-Kamera aufnehmen und sie auf dem Bildschirm anzeigen. Ich habe jedoch Probleme mit der Hintergrundsubtraktionsklasse. Ich kann ein neues BackgroundSubtractorMOG-Objekt im Konstruktor erstellen, aber wenn ich versuche, den folgenden Code auszuführen, wird erzwungen, dass ich den Fehler "Nur 1- und 3-Kanal-8-Bit-Bilder werden in BackgroundSubtractorMOG unterstützt" vom systemeigenen Code erhalten. Ich habe versucht, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA zu Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGB zu ändern, und dann wird kein Beenden erzwungen, aber alles, was ich bekomme, ist ein schwarzer Bildschirm. Ich bin mir ziemlich sicher, dass bmp bei FRAME_RGB immernoch null ist, weil der Bildschirm schwarz bleibt und der fps-Counter, den ich direkt nach der Bitmap gezeichnet habe (aus dem unten angezeigten Code zur besseren Übersichtlichkeit und zur Fehlerbehebung), nicht angezeigt wird.
Ich habe mir den OpenCV C ++ Code für diese Funktion angeschaut ( Zeile 388 hier ), und der Bildtypfehler tritt auf, wenn der Bildtyp nicht CV_8UC1 oder CV_8UC3 ist, also habe ich versucht, den Java-CvType.CV_8UC3 anstelle von Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA in capture.retrieve zu verwenden (), aber es wird geschlossen, und ich habe einen Fehler "Ausgabeframe-Format wird nicht unterstützt".
Ich schätze, ich habe gerade ein Typkonvertierungsproblem, aber ich kann nicht für das Leben von mir herausfinden, wo die Android-spezifischen Bildtypen von OpenCV mit ihren normalen Bildtypen übereinstimmen, die dokumentiert sind. Jede Hilfe wäre willkommen.
Die Variablen:
%Vor%Meine SurfaceView-Funktion run ():
%Vor%Die Funktion processFrame (), auf die in run () verwiesen wird:
%Vor%Bearbeiten:
Die Lösung, die am Ende funktionierte:
%Vor% Haben Sie versucht, cvtColor mit CV_RGB2RGBA
und CV_RGBA2RGB
. Also, versuche vielleicht, Frame RGBA in RGB umzuwandeln, dann mache Hintergrund Subtraktion. Etwas wie das:
BEARBEITEN: Sie können den OpenCV Unit-Test für BackgroundSubtractorMOG
unter hier . Der Test hat jedoch im Haupttest fail("Not yet implemented");
.
Ich bin mir nicht sicher, ob das bedeutet, dass der Test nicht abgeschlossen ist oder die Unterstützung für BackgroundSubtractorMOG
nicht implementiert ist. Sie könnten versuchen, den in diesem Unit-Test enthaltenen Code auszuführen, um zu sehen, ob er tatsächlich funktioniert.
Auch das C ++ - Beispiel segment_objects.cpp kann hilfreich sein als Verwendungsbeispiel.
Hoffe das hilft! :)
Danke euch so sehr! Und für zukünftige Zuschauer, die auf diese Seite kommen, müssen Sie vielleicht dieses Wissen optimieren, um Dinge zum Laufen zu bringen. In SDK v2.4.4 habe ich dies in der onCameraFrame-Methode angewendet. Erinnern Sie sich, dass die Methode einen Eingabeframe von der Kamera aufnimmt. Sie verwenden die Eingabe und geben den Rahmen zurück, der auf dem Bildschirm Ihres Android-Geräts angezeigt werden soll. Hier ist ein Beispiel:
%Vor%Um meinen Punkt über das graue Bild zu erklären, das aus apply () kommt, wenn Sie eine RGBA-Version erstellen möchten, müssen Sie nach dem Aufruf von apply ():
möglicherweise eine cvtcolor verwenden %Vor%Auch mit der neuesten openCV müssen Sie initialisieren mit:
private BackgroundSubtractorMOG2 Sub = Video.createBackgroundSubtractorMOG2 ();
Tags und Links java android opencv computer-vision background-subtraction