我想用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);
}
输入(在寻找轮廓之前,imageA已经处理完毕):
输出:
修改 问题部分解决 反转像素,使黑色为背景,白色前景有助于图像上方的图像。但是我仍然在某些图像上获得内部轮廓。像这样:
输入
输出
答案 0 :(得分:0)
您输入的图像并不适合提取您想要的轮廓。
您的输入轮廓是这些(图像的一部分):
每种颜色都是单个轮廓(以及一些白色轮廓)
对于红色轮廓,我绘制了边界矩形,这与您用于显示轮廓的方法相同。所有其他彩色轮廓都不在红色轮廓内部,而是在边界矩形内部,这就是为什么它们被找到,即使你选择只找到外部轮廓。
你真正想要的是这样的:
但要获得该结果,您的输入图像也必须连接椭圆的那条线!!
对于你的输入图像,很难提取这些线条,也没有获得地面线条,但一个简单的方法可能是使用几个扩张操作,然后在输入图像上进行相同数量的侵蚀操作,在提取轮廓之前。尽管如此,这对于所有设置都不会稳定;)