【发布时间】:2015-03-02 12:09:46
【问题描述】:
我想用RETR_EXTERNAL 获取所有外轮廓,但由于某些奇怪的原因,openCV 认为图像边框也是轮廓,因此丢弃了所有内轮廓。我到底做错了什么?
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(imageA, contours, hierarchy, Imgproc.RETR_EXTERNAL,
Imgproc.CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++) {
double[] c = hierarchy.get(0, i);
Rect rect = Imgproc.boundingRect(contours.get(i));
Core.rectangle(image, new Point(rect.x, rect.y),
new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0), 3);
}
输入(图像A在轮廓查找之前被处理过):
输出:
编辑: 问题部分解决 反转像素,使黑色为背景,白色为前景,有助于上图。但是,我仍然在某些图像上得到内部轮廓。喜欢这个:
输入
输出
【问题讨论】:
-
输入图像应该是 Cv_8UC1,前景像素必须是白色,所以你应该反转你的图像(255-imageA)然后它应该可以工作!
-
你说得对,我把它倒过来了,现在这张图片表现得像预期的那样。然而其他人没有。绘制明显位于其他矩形内部的矩形。
-
您可以发布其中一个示例的
imageA吗? -
@TomTom... 尝试使用
Imgproc.RETR_LIST而不是Imgproc.RETR_EXTERNAL. -
@Micka 当然我编辑了帖子并添加了一个示例。请注意,这不是原始图像大小。大约七分之一。