Поиск процента цвета в изображении OpenCV Android SDK - PullRequest
1 голос
/ 13 февраля 2020

Я работаю над Android проектом для определения цвета с использованием OpenCV Android SDK. Я смог отделить зеленую и коричневую маску от изображения, но мне нужен процент зеленого и коричневого цвета на изображении. Я не уверен, как go сделать это.

oImage = imread(pathOfFile);
hsvImage = new Mat();
color_range1 = new Mat();
color_range2 = new Mat();

Imgproc.cvtColor(oImage, hsvImage, Imgproc.COLOR_BGR2HSV);
Core.inRange(hsvImage, new Scalar(25,52,72), new Scalar(102,255,255), color_range1); // Green
Core.inRange(hsvImage, new Scalar(10, 100, 20), new Scalar(20, 255, 200), color_range2); // Brown

// I have the Green and Brown mask in color_range1 and color_range2 respectively.
// Now what

color_range1.release();
color_range2.release();
hsvImage.release();
oImage.release();

У меня есть рабочая Python реализация решения, но я не уверен, как преобразовать его в Java.

    img = cv2.imread("__FILE_PATH__")
    grid_HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    lower_green = np.array([25,52,72])
    upper_green = np.array([102,255,255])

    lower_brown = np.array([10, 100, 20])
    upper_brown = np.array([20, 255, 200])

    mask= cv2.inRange(grid_HSV, lower_green, upper_green)
    brown_mask= cv2.inRange(grid_HSV, lower_brown, upper_brown)

    Green Percent - round(((mask>0).mean())*100,3)
    Brown Percent - round(((brown_mask>0).mean())*100,3)

1 Ответ

0 голосов
/ 13 февраля 2020

Вы можете прочитать каждый пиксель вашего изображения по одному, как указано в здесь , а затем сосчитать их.

    int color_range1_counter = 0;
    int color_range2_counter = 0;


    for (int i=0; i<hsvImage.rows; i++)
    {
        for (int j=0; j<hsvImage.cols; j++)
        {
            double[] hsv = image.get(0, 0);
            if(hsv[0]>25 && hsv[0]<102 && hsv[1]>52 && hsv[1]<255 && hsv[2]>72 && hsv[2]<255)
            color_range1_counter++;

            if(hsv[0]>10 && hsv[0]<20 && hsv[1]>100 && hsv[1]<255 && hsv[2]>20 && hsv[2]<200)
            color_range2_counter++;

        }
    }
    double percentage = color_range1_counter/(color_range1_counter + color_range2_counter)

Примечание: Значения канала (пикселя) определяются в соответствии с вашими скалярными пределами inRange.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...