ANDROID - определение цвета с помощью openCV - как?

моя цель - отобразить обмолоченное изображение с использованием цветового пространства HSV таким образом, чтобы отображались только желтые объекты. Я использую этот код (на основе кода, предоставленного openCV 2.3.1 для Android):

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;
}

базовый (абстрактный) класс содержит метод "run":

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 раза? а что такое черная горизонтальная линия? enter image description here что я делаю не так?

напоследок, какова логика:

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;
}

и получил: enter image description here

?

Обновление 2:

Я наконец понимаю, что перед установкой кадра его необходимо преобразовать в пространство RGB A . Итак, я попробовал установить порог с помощью следующего кода:

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);

, но теперь это дает мне принудительное отключение ... есть идеи?

8
задан gor 25 February 2012 в 20:09
поделиться