在 opencv-java 中优化 GrabCut 的性能
最近,我得到了一个项目,我必须从给定的图像中提取面部(面部+头发)。
我通过以下方式解决此问题。
- 我正在从给定图像中提取人脸位置。[我得到一个矩形]
- 我正在提取该矩形并将其放置在与输入图像尺寸相同的另一个图像中。[face_image]
- 我正在步骤2 face_image应用grabCut算法。
当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 算法的性能,使其仅检测给定图像中的人脸和头发?