moim celem jest wyświetlanie zmłobionego obrazu za pomocą przestrzeni kolorów HSV w taki sposób, aby pokazywały się tylko żółte obiekty. Używam tego kodu (na podstawie kodu podanego przez OpenCV próbki android 2.3.1):ANDROID - wykrywanie koloru za pomocą openCV - jak?
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;
}
podstawa (Abstract) klasa zawiera "run" metody:
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);
...
}
uzyskać to zniekształcony podgląd, który myślę, że rozumiem (format HSV), ale dlaczego to się powtarza (i rysuję zieloną linię, aby to podkreślić) 4-krotnie? i jaka jest czarna pozioma linia? co robię źle?
ostatnia rzecz, jaka jest logika:
Imgproc.cvtColor(mHSV, mRgba, Imgproc.COLOR_RGB2HSV, 4);
dlaczego jest COLOR_RGB2HSV? nie powinno to być COLOR_HSV2RGB?
Załóżmy, że przekazałem ten problem, w jaki sposób mogę utworzyć obraz poziomu szarości z żółtymi obiektami w ich macierzystym kolorze? Myślałem, że przy użyciu metody Core.inRange(), ale kiedy to zrobię, dostaję czarny ekran.
tak, myślę, że wyglądam jak totalny szarpnięcie, ale muszę zacząć od czegoś, prawda?
10x!
Aktualizacja 1: próbowałem zrobić RGB->> RGB HSV ten sposób:
@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;
}
i mam:
?
Aktualizacja 2:
końcu zrozumieć, że przed ustawieniem ramkę, to musi być przekształcony RGB przestrzeni. więc teraz spróbował próg z kodem następujące:
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);
ale teraz daje mi wymusić zamknięcie ... jakieś pomysły?
Wiem, że jakiś czas temu i nie jest to właściwy sposób zadawania pytań - ale czy zrobiłeś samouczek? ponieważ nie mogę uruchomić VideoCapture, byłbym zadowolony, gdybyś mógł podać swój kod lub części kodu na github. Wielkie dzięki – user1651460
Hej tam. Naprawdę mi przykro, ale minęło trochę czasu odkąd pracowałem z openCV, Plus nie mam już kodu. Radzę zajrzeć tutaj: http://docs.opencv.org/doc/tutorials/highgui/video-write/video-write.html#videowritehighgui. Powodzenia, ciężka praca się opłaca :) – gor