java - Java Imgproc 的 OpenCV 的 GC_INIT_WITH_MASK 给出了奇怪的结果
问题描述
在第一次分段时,我使用 GC_INIT_WITH_RECT 完成了它,它工作正常。但是在第二次分割时,我使用了 GC_INIT_WITH_MASK 但它给了我奇怪的结果。
创建了一个新的掩码newmask
,并用 GC_PR_BGD 填充,这可能是背景。
newmask = new Mat(bitmapImage.getHeight(), bitmapImage.getWidth(), CvType.CV_8UC1, new Scalar(Imgproc.GC_PR_BGD));
我有一个画布,我可以在蒙版上绘制图像作为视觉参考。我有一个按钮可以更改gcColor
为 GC_PR_FGD、GC_FGD、GC_BGD。有了这个,我可以标记图像的可能前景、确定前景和确定背景。
if (count == 0) {
paintDraw.setColor(Color.BLACK);
gcColor = new Scalar(Imgproc.GC_PR_FGD);
} else if (count == 1) {
paintDraw.setColor(Color.BLUE);
gcColor = new Scalar(Imgproc.GC_FGD);
} else if (count == 2) {
paintDraw.setColor(Color.RED);
gcColor = new Scalar(Imgproc.GC_BGD);
}
绘制在newmask
:
Imgproc.circle(newmask, nm, 10, gcColor, 10); //nm being the Point
带面具的抓取代码:
Bitmap bmp = bitmapImage;
Mat img = new Mat();
Bitmap bmp32 = bmp.copy(Bitmap.Config.RGB_565, true);
Utils.bitmapToMat(bmp32, img);
Imgproc.cvtColor(img, img, Imgproc.COLOR_BGRA2BGR);
// Up to this point: Bitmap is converted to Mat and removes alpha channel
Mat background = new Mat(img.size(), CvType.CV_8UC3, new Scalar(255, 255, 255));
Mat bgModel = new Mat();
Mat fgModel = new Mat();
Mat source = new Mat(1, 1, CvType.CV_8UC3, new Scalar(Imgproc.GC_PR_FGD));
Mat dst = new Mat();
Rect rect = new Rect(tl, br); // rect coordinates from previous segmentation
Imgproc.grabCut(img, newmask, rect, bgModel, fgModel, 1, Imgproc.GC_INIT_WITH_MASK);
Core.compare(newmask, source, newmask, Core.CMP_EQ);
Mat segmentedImg= new Mat(img.size(), CvType.CV_8UC3, new Scalar(255, 255, 255));
img.copyTo(segmentedImg, newmask); //segmented image stored in segmentedImg as a Mat
据我了解,外面的一切都rect
被标记为背景。但是当我取回分割后的图像时,图像之外的区域rect
也受到 GC_INIT_WITH_MASK 的影响。
*红色标记是 GC_BGD 肯定是背景
*蓝色标记是 GC_FGD 肯定是前景
解决方案
推荐阅读
- primefaces - JSF / primefaces 处理ajax请求中的控制字符(换页十六进制:0x0c)?
- spring - JedisConnectionFactory 的方法已被弃用。在 Spring Batch 中使用哪些 XML 配置?
- javascript - 这被 babel 解析为 UMD 模块中的未定义
- python - 记录注册用户的操作
- python - 为功能性 keras 模型格式化具有多个类别的多个输入并将其提供给模型
- python-3.x - 使用 python 获取“成本”google adward api
- pyspark - 以相同顺序对具有至少两次相同描述符的案例进行分组
- php - 使用 AJAX / JSON 将值传递给文本框
- c# - 存储过程不返回动态查询行,Dapper
- vba - 小计和复制/粘贴可变范围