ANDROID - Farbe-Erkennung mit openCV - aber wie?
mein Ziel ist die Anzeige eines drosch Bild mit dem HSV-Farbraum in einer Weise, dass nur gelbe Objekte angezeigt. ich benutze diesen code (basierend auf einem code-gegeben durch die openCV-2.3.1 android-Proben):
protected Bitmap processFrame(VideoCapture capture) {
//capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
//Imgproc.cvtColor(mGray, mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
Imgproc.cvtColor(mHSV, mRgba, Imgproc.COLOR_RGB2HSV, 4);
//Core.inRange(mRgba, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mRgba);
Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
if (Utils.matToBitmap(mRgba, bmp))
return bmp;
bmp.recycle();
return null;
}
Basis (Abstrakte)Klasse, enthält die "run" - Methode:
protected abstract Bitmap processFrame(VideoCapture capture);
public void run() {
...
bmp = processFrame(mCamera);
...
canvas.drawBitmap(bmp, (canvas.getWidth() - bmp.getWidth()) / 2, (canvas.getHeight() - bmp.getHeight()) / 2, null);
...
}
bekomme ich dieses verzerrte Vorschau, die ich denke, ich kann verstehen (HSV-format), aber warum ist es, sich zu wiederholen (i ' V zeichnen Sie eine grüne Linie zu betonen, es) 4 mal? und was ist die schwarze horizontale Linie?
was mache ich falsch?
eine Letzte Sache, was ist die Logik hinter:
Imgproc.cvtColor(mHSV, mRgba, Imgproc.COLOR_RGB2HSV, 4);
warum ist es COLOR_RGB2HSV? sollte es COLOR_HSV2RGB?
Lassen Sie s sagen ich ' V übergeben dieses problem, wie kann ich eine Grau-Bild mit dem gelben Objekte in Ihrer nativen Farbe? ich dachte, mit dem Kern.inRange () - Methode, aber wenn ich das mache bekomme ich schwarzen Bildschirm.
ja, ich denke, ich sehe aus wie ein Gesamt Ruck, aber ich brauche zum starten von irgendwo, nicht ich?
10x!
Update 1:
ich habe versucht zu tun, RGB->HSV->RGB auf diese Weise:
@Override
protected Bitmap processFrame(VideoCapture capture) {
//capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
//Imgproc.cvtColor(mGray, mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGB);
Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_RGB2HSV,0);
//Imgproc.cvtColor(mRgba, mRgba, Imgproc.COLOR_BGR2RGB, 4);
//Core.inRange(mRgba, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mRgba);
Imgproc.cvtColor(mHSV,mRgba , Imgproc.COLOR_HSV2RGB,0);
Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
if (Utils.matToBitmap(mRgba, bmp))
return bmp;
bmp.recycle();
return null;
}
und ich bekam:
?
Update 2:
ich endlich verstehen, dass vor der Festlegung eines Rahmens, muss es umgewandelt werden in RGB - Eine Raum.
so habe ich nun versucht, die Schwelle mit dem code wie folgt:
capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_RGB2HSV,0);
Core.inRange(mHSV, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mHSVThreshed);
Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_HSV2RGB, 0);
Imgproc.cvtColor(mRgba, mRgba, Imgproc.COLOR_RGB2RGBA, 0);
Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
aber jetzt gibt es mir Kraft, shutdown... irgendwelche Ideen?
- Ich weiß, das ist einige Zeit her und es ist nicht die richtige Art zu Fragen - aber hast du schon eine Anleitung dafür? wie kann ich nicht bekommen, der Videoergreifung arbeiten ich würde mich freuen, wenn Sie bieten könnte, Ihren code oder Teile des Codes auf github. Großen Dank
- Heyho. Ich
m really sorry but it has been a while since i
v arbeitete mit openCV, Plus ich habe nicht den code mehr. Ich rate dir, schau mal hier: docs.opencv.org/doc/tutorials/highgui/video-write/.... Viel Glück, harte Arbeit zahlt sich irgendwann 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke mHSVThreshed ist eine binäre mat
also vielleicht diese Zeile :
ändern sollte :
Ich verbrachte eine Menge Zeit, die sich mit der "zeigen" - problem zu...
hoffe, dass dies helfen...
Freunde. ich gebe Ihnen das Ergebnis der 1 Monat harter Arbeit und Hilfe von Freunden über den Ozean:
Ethan hatte Recht. aber der code, der benötigt einige Befestigung.
code:
ersten, die Matte ist Binär 0 oder 255 ein, so dass die Transformation graue Ebene ist mehr "natürlich". zweitens, die Umwandlung von HSVto RGBis in der Tat HSV-BGR!!. und die Letzte Sache ist, dass die Vorschau wird erwartet, RGBA-Bitmaps.
thats it. hoffe, dass andere davon profitieren können dieser Beitrag. SHALOM!
Gut, soweit ich es sehen-Holen Sie das Bild Bild in RGBA und speichern Sie es unter dem Namen "mHSV"
capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
so sollten Sie es speichern Sie es als mRgba
in der cvtColor, die Sie brauchen, um es zu transformieren, um dem HSV über COLOR_RGBA2HSV. Vorausgesetzt, Sie haben die Namen geändert wäre dies:
Und ich nehme an, diese Wiederholung der Bilder stammt aus der "4" in der Sie cvtColor Funktion, da Ihre HSV-Bild werden nur 3 Kanäle. Setzen Sie in eine 0 und es sollte automatisch erkannt werden...
Ich hoffe, es hilft...
warum ist es COLOR_RGB2HSV? sollte es COLOR_HSV2RGB?
Ich würde sagen, es sollte :).
Sieht aus wie ein problem wie opencv packt die Pixel. Überprüfen Sie, dass sowohl Ihre input-und output-Bilder haben die gleiche Größe und Anzahl Kanäle.
Diese
sieht auch komisch zu mir, speichern Sie die RGBA-Bild, dass man in ein Bild im HSV-format?
Das würde das problem erklären.
Versuchen Sie, etwas zu tun : RGB(erfassen, abrufen) => HSV cvt(Farbe) => Farbe-Erkennung => RGB (cvt Farbe wieder)