A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

内容来自OpenCV-Python Tutorials 自己翻译整理

目标
理解什么是轮廓
找轮廓、绘制轮廓
学习如下函数cv2.findContours(), cv2.drawContours()

什么是轮廓?
轮廓可以理解为将所有连续的像素点(沿着边界)连接咋我一起的曲线,这些像素有相同的颜色或者灰度。轮廓在形状分析和物体识别上有重要应用。

为了提高精确度、要使用二值图像。寻找轮廓前,要进行阈值化处理或者canny边缘检测
查找轮廓会修改原始图像,所以原始图像要备份
要找的物体应该是白色的,在黑色的背景当中
import numpy as np
import cv2

im = cv2.imread('3.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

cv2.imshow('res',image)

cv2.waitKey(0)
cv2.findContours()输入三个参数,第一个参数是输入图像,第二个参数是轮廓查找方式,第三个参数是轮廓近似方法。
返回值有三个,第一个是图像(二值),第二个是纯轮廓,第三个是轮廓层次

返回的纯轮廓是一个python的列表,此处存储所有图像中的轮廓,每一个轮廓都是numpy数组,包含检测物体边界点

如何绘制轮廓?
cv2.drawContours()函数来绘制轮廓,根据用户提供的边界点绘制任何形状。
输入参数为,原始图像,轮廓(列表),轮廓索引(绘制独立轮廓时有用,-1绘制所有轮廓)
,轮廓颜色,轮廓厚度等等。

在图像中绘制所有轮廓

import numpy as np
import cv2

im = cv2.imread('1.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)


img = cv2.drawContours(im, contours, -1, (0,255,0), 3)

cv2.imshow('res',img)

cv2.waitKey(0)

绘制第四个轮廓

import numpy as np

import cv2


im = cv2.imread('1.jpg')

imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(imgray,127,255,0)

image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)



img = cv2.drawContours(im, contours, 3, (0,255,0), 3)


cv2.imshow('res',img)


cv2.waitKey(0)


多数情况下这样使用,与上面结果一样

import numpy as np

import cv2


im = cv2.imread('1.jpg')

imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(imgray,127,255,0)

image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)



cnt = contours[3]

img = cv2.drawContours(im, [cnt], 0, (0,255,0), 3)


cv2.imshow('res',img)


cv2.waitKey(0)

轮廓近似方法

cv2.findCountours() 函数的第三个参数,是什么意思?
轮廓是形状具有相同灰度的边界值,在轮廓中会存储所有边界上的(x,y)坐标。但是不一定需要全部存储,这时用参数来控制。

参数在设置为 cv2.CHAIN_APPROX_NONE时所有边界点会被存储,但是事实上并不一定需要那么多,例如边界是一条直线时,你不需要直线上的所有点,有两个端点即可,这就是cv2.CHAIN_APPROX_SIMPLE参数提供的,它会去电多余的点。


5 个回复

倒序浏览
奈斯,优秀
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马