Я создаю мобильное приложение для Android с использованием библиотеки OpenCV, которая обрабатывает изображение, которое мы получаем с помощью нашего смартфона, через приложение, оно обрабатывает изображение для определения значений цвета кожи (с верхним и нижним порогом) и используетОбнаружение края, чтобы нарисовать белые линии вокруг этого цветового диапазона.До сих пор можно определить только тон кожи, но я понятия не имею, как извлечь значения цвета кожи в числах RGB / HSV, таких как (255,255,255) или значения HSV с плавающей запятой.Эти значения будут сравниваться с жидкими оттенками основы, чтобы определить, какие оттенки являются ближайшими к коже на изображении.Я знаю о переменных освещения и так далее, но все же хочу получить значения цвета.Любые идеи о том, как я должен обойти это?Я импортировал библиотеку, и они работали.Вывод отображает линию контура лица, как в ссылке:
![image](https://i.imgur.com/dy1KTp3m.png)
Я попытался использовать 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);
}