您的位置:首页 > 编程语言 > Python开发

python OpenCV学习笔记(十六):轮廓

2018-02-02 16:53 423 查看
官方文档 – https://docs.opencv.org/3.4.0/d4/d73/tutorial_py_contours_begin.html

轮廓

轮廓可以简单地解释为一条连接所有连续点(沿边界)的曲线,具有相同的颜色或强度。轮廓是形状分析和物体检测和识别的有用工具。

import numpy as np
import cv2 as cv

im = cv.imread('test.jpg')
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(img, 127, 255, 0)
im2, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)


image, contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])


image:源图

mode:轮廓检索模式

method:轮廓近似法

cv.findContours()
方法输出一个经过修改的图像,轮廓列表和层次结构。contours是一张图中所有轮廓线的Python列表。每一个单独的轮廓都是一个(x,y)的边界点的坐标点。

画轮廓

cv.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])


如果你有它的边界点,
cv.drawContours()
也可以用来画任何形状。第一个参数是源图像;第二个参数是所有轮廓的一个python列表;第三个参数是轮廓的索引(在绘制个别轮廓是很有用,绘制所有轮廓,则传参 -1);剩下的是颜色,厚度等。

在图像中画出所有的轮廓:

cv.drawContours(img, contours, -1, (0,255,0), 3)


画一个指定的轮廓线,比如第四条轮廓线:

cv.drawContours(img, contours, 3, (0,255,0), 3)


但是大多数情况下,使用下面的方法

cnt = contours[3]
cv.drawContours(img, [cnt], 0, (0,255,0), 3)


轮廓近似法

这是
cv.findContours()
的第三个参数,它表示什么?

上面,我们说轮廓是一个有着同样强度的边界形状,它存储了边界的(x,y)坐标。但是它是否存储了所有的坐标?这是通过轮廓近似法来确定的。

如果你传入 cv.CHAIN_APPROX_NONE,所有的边界点都被存储。但实际上我们需要所有的点吗?例如,你发现了一条直线的轮廓。你需要线上的所有点来表示这条线吗?不,我们只需要这条线的两个端点。这是cv.CHAIN_APPROX_SIMPLE 。它删除了所有的冗余点,压缩了轮廓,从而节省了内存。

下图显示的是一个矩形的图像。只要是在轮廓列表(contours)中的坐标,就画一个圆(用蓝色表示)。第一张图片显示的是我的cv.CHAIN_APPROX_NONE(734个点)和第二个图像显示带有cv的cv.CHAIN_APPROX_SIMPLE(只有4分)。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OpenCV