моя цель - отобразить обмолоченное изображение с использованием цветового пространства HSV таким образом, чтобы отображались только желтые объекты. я использую этот код (на основе кода, заданного образцами Android openCV 2.3.1):
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;
}
базовый (абстрактный) класс содержит метод «выполнить»:
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);
...
}
я получаю это искаженное превью, которое, я думаю, я могу понять (формат HSV), но почему оно повторяется (я рисую зеленую линию, чтобы подчеркнуть это) 4 раза? а что за черная горизонтальная линия? что я делаю не так?
и последнее, в чем логика:
Imgproc.cvtColor(mHSV, mRgba, Imgproc.COLOR_RGB2HSV, 4);
почему это COLOR_RGB2HSV? разве это не должно быть COLOR_HSV2RGB?
Допустим, я решил эту проблему, как я могу сделать изображение уровня серого с желтыми объектами в их родном цвете? я думал использовать метод Core.inRange(), но когда я это делаю, я получаю черный экран.
да, наверное, я выгляжу полным придурком, но мне нужно с чего-то начинать, не так ли?
10x!
Обновление 1: я пытался сделать RGB->HSV->RGB следующим образом:
@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;
}
и я получил:
?
Обновление 2:
я наконец понимаю, что перед установкой кадра его нужно преобразовать в пространство RGBA. поэтому я теперь попробовал порог с кодом следующим образом:
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);
но теперь это дает мне принудительное отключение ... есть идеи?
m really sorry but it has been a while since i
v работал с openCV, плюс у меня больше нет кода. Советую посмотреть здесь: docs.opencv .org/doc/tutorials/highgui/video-write/. Удачи, трудолюбие рано или поздно окупится :) - person gor   schedule 05.01.2014