我从阅读这个开始Mat
。
然后我将其转换为灰度并应用于Imgproc.canny()
它,得到以下蒙版。
然后我曾经Imgproc.findContours()
找到轮廓,Imgproc.drawContours()
,并Core.putText()
用数字标记轮廓:
然后我做Rect boundingRect = Imgproc.boundingRect(contours.get(0));
Mat submatrix = new Mat();
submatrix = originalMat.submat(boundingRect);
了以下事情submatrix
:
到现在为止还挺好。问题从此开始:
现在我需要一个面具submatrix
。所以我决定用Imgproc.drawContours()
得到面具:
Mat mask = new Mat(submatrix.rows(), submatrix.cols(), CvType.CV_8UC1);
List<MatOfPoint> contourList = new ArrayList<>();
contourList.add(contours.get(0));
Imgproc.drawContours(mask, contourList, 0, new Scalar(255), -1);
我得到了以下面具:
我期待的是黑色背景上的填充(白色)钻石形状。
为什么我会得到这个意想不到的结果?
编辑:
当我替换
Mat mask = new Mat(submatrix.rows(), submatrix.cols(), CvType.CV_8UC1);
为Mat mask = Mat.zeros(submatrix.rows(), submatrix.cols(), CvType.CV_8UC1);
时,最后一个带有白色垃圾的蒙版被一个空的黑色蒙版替换,上面没有任何白色。我得到了以下子垫和掩码:我得到了轮廓列表(命名
contours
)中的contours.get(0)
第一个轮廓,并使用这个第一个轮廓来计算Imgproc.boundingRect()
以及contourList.add(contours.get(0));
稍后(其中contourList
只有一个轮廓的列表将在最后一个中使用drawContours()
)。然后我继续更改
contours.get(0)
为contours.get(1)
inImgproc.boundingRect()
以及 incontourList.add();
(就在之前Imgproc.drawContours()
)。这导致了这个子垫和掩码:然后我改回
contours.get(0)
inImgproc.boundingRect()
; 并contourList.add(contours.get(1));
在那里。得到以下子垫和掩码:
现在我完全无法理解这里发生了什么。