Есть ли способ получить точные значения цветов RGB / HSV и сравнить похожие цвета с OpenCV для студии Android? - PullRequest
2 голосов
/ 22 июня 2019

Я создаю мобильное приложение для Android с использованием библиотеки OpenCV, которая обрабатывает изображение, которое мы получаем с помощью нашего смартфона, через приложение, оно обрабатывает изображение для определения значений цвета кожи (с верхним и нижним порогом) и используетОбнаружение края, чтобы нарисовать белые линии вокруг этого цветового диапазона.До сих пор можно определить только тон кожи, но я понятия не имею, как извлечь значения цвета кожи в числах RGB / HSV, таких как (255,255,255) или значения HSV с плавающей запятой.Эти значения будут сравниваться с жидкими оттенками основы, чтобы определить, какие оттенки являются ближайшими к коже на изображении.Я знаю о переменных освещения и так далее, но все же хочу получить значения цвета.Любые идеи о том, как я должен обойти это?Я импортировал библиотеку, и они работали.Вывод отображает линию контура лица, как в ссылке:

image

Я попытался использовать Android.Palette с помощью getRGB из getDominantSwatch.Значение не является правильным.Я надеюсь, что любые эксперты могут высказать свое мнение по этому поводу, так как я всего лишь новичок в OpenCV, но я хочу учиться.Пример кода OpenCV приведен ниже, а пример вывода:

    import org.opencv.android.Utils;
    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.core.MatOfPoint;
    import org.opencv.imgcodecs.*;
    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.core.CvType;
    import org.opencv.core.Scalar;
    import org.opencv.imgproc.Imgproc;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

           if (requestCode == IMAGE_REQUEST && resultCode == RESULT_OK) {
            Bitmap myBitmap = BitmapFactory.decodeFile(currentImagePath);
            imageView.setImageBitmap(myBitmap);
            //until here works and tested

            Utils.bitmapToMat(myBitmap, mRgbMat);
            Imgproc.cvtColor(mRgbMat, mHsvMat, Imgproc.COLOR_RGB2HSV, channelCount);


            Scalar lowerThreshold = new Scalar(0, 48, 80); // lower hsv values
            Scalar upperThreshold = new Scalar(20, 255, 255); // higher hsv values

            Core.inRange(mHsvMat, lowerThreshold, upperThreshold, mMaskMat);

            Imgproc.dilate(mMaskMat, mDilatedMat, new Mat());
            //Scalar used = new Scalar(Core.inRange(mHsvMat, lowerThreshold, upperThreshold, mMaskMat));


            Imgproc.findContours(mMaskMat, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

            // Find max contour area
            double maxArea = 0;
            Iterator<MatOfPoint> each = contours.iterator();
            while (each.hasNext()) {
                MatOfPoint wrapper = each.next();
                double area = Imgproc.contourArea(wrapper);
                if (area > maxArea)
                    maxArea = area;
            }

            // Filter contours by area and resize to fit the original image size
            mMaxContours.clear();
            each = contours.iterator();
            while (each.hasNext()) {
                MatOfPoint contour = each.next();
                if (Imgproc.contourArea(contour) > mMinContourArea*maxArea) {
                    mMaxContours.add(contour);
                }
            }

            Imgproc.drawContours(mRgbMat, mMaxContours,0, colorGreen, iLineThickness);
            Log.d(TAG + " contours" ,  contours.size() + " used colour: " + mHsvMat );

            // convert to bitmap:
            Bitmap bm = Bitmap.createBitmap(mRgbMat.cols(), mRgbMat.rows(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(mRgbMat, bm);

            // find the imageview and draw it!
            imageView2.setImageBitmap(bm);
}


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