//grabCut分割技术
public static Mat myGrabCut(Mat in, Point tl, Point br) {
Mat mask = new Mat();
Mat image = in;
mask.create(image.size(), CvType.CV_8UC1);
mask.setTo(new Scalar(0));
Mat bgdModel = new Mat();// Mat.eye(1, 13 * 5, CvType.CV_64FC1);
Mat fgdModel = new Mat();// Mat.eye(1, 13 * 5, CvType.CV_64FC1);
Rect rectangle = new Rect(tl, br);
Imgproc.grabCut(image, mask, rectangle, bgdModel, fgdModel, 3, Imgproc.GC_INIT_WITH_RECT);
Mat source = new Mat(1, 1, CvType.CV_8U, new Scalar(3));
Core.compare(mask, source, mask, Core.CMP_EQ);
Mat foreground = new Mat(image.size(), CvType.CV_8UC1, new Scalar(0, 0, 0));
image.copyTo(foreground, mask);
return foreground;
}
//在处理结束之后,mask中会保存结果。mask只能取以下四种值:
//GCD_BGD(=0),背景;
//GCD_FGD(=1),前景;
//GCD_PR_BGD(=2),可能的背景;
//GCD_PR_FGD(=3),可能的前景。
//如果没有手工标记GCD_BGD或者GCD_FGD,那么结果只会有GCD_PR_BGD或GCD_PR_FGD;
//rect——用于限定需要进行分割的图像范围,只有该矩形窗口内的图像部分才被处理;
//bgdModel——背景模型,如果为null,函数内部会自动创建一个bgdModel;bgdModel必须是单通道浮点型(CV_32FC1)图像,且行数只能为1,列数只能为13x5;
//fgdModel——前景模型,如果为null,函数内部会自动创建一个fgdModel;fgdModel必须是单通道浮点型(CV_32FC1)图像,且行数只能为1,列数只能为13x5;
//iterCount——迭代次数,必须大于0;
//mode——用于指示grabCut函数进行什么操作,可选的值有:
//GC_INIT_WITH_RECT(=0),用矩形窗初始化GrabCut;
//GC_INIT_WITH_MASK(=1),用掩码图像初始化GrabCut;
//GC_EVAL(=2),执行分割。