Недавно мне был предоставлен проект, в котором мне нужно извлечь лицо (лицо + волосы) из заданного изображения.
Я решаю эту проблему следующими способами.
- Я извлекаю места для лица из заданного изображения. [Я получаю прямоугольник]
- Я извлекаю этот прямоугольник и помещаю его в другое изображение того же размера, что и входное изображение. [face_image]
- Я применяю алгоритм grabCut на face_image шага 2.
Когда face_image содержит плавный фон, тогда алгоритм grabCut работает хорошо, но когда фон face_image является сложным, тогда алгоритм grabCut извлекает часть фона в обработанное изображение.
Вот моментальный снимок результатов, которые я получаю.
Вот мой код grabCut:
public void extractFace(Mat image, String fileNameWithCompletePath,
int xOne, int xTwo, int yOne, int yTwo) throws CvException {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Rect rectangle = new Rect(xOne, yOne, xTwo, yTwo);
Mat result = new Mat();
Mat bgdModel = new Mat();
Mat fgdModel = new Mat();
Mat source = new Mat(1, 1, CvType.CV_8U, new Scalar(3));
Imgproc.grabCut(image, result, rectangle, bgdModel, fgdModel, 8, Imgproc.GC_INIT_WITH_RECT);
Core.compare(result, source, result, Core.CMP_EQ);
Mat foreground = new Mat(image.size(), CvType.CV_8UC3, new Scalar(255, 255, 255));
image.copyTo(foreground, result);
Imgcodecs.imwrite(fileNameWithCompletePath, foreground);
}
Как повысить производительность алгоритма grabCut, чтобы он обнаруживал только лицо и волосы с данного изображения?