基本思路
首先,先将图像进行灰度处理,在借助模糊处理,得到边缘检测图像;接着,借用边缘检测图像,获取图像轮廓参数,通过面积,以及边框数,检测出图形的形状。OK,Let‘s go!
Opencv版本
这个opencv-contrib-python ,这是个辅助包,最好都装上且跟opencv同版本最优。
函数介绍
cv2.findContours()
注意事项
- 读取的是二值图像,黑色为背景,白色为读取目标
- 该函数会修改原图像,需要先copy一份原图像
- 返回的参数,会随着opencv不同版本,返回参数个数不同,一般为2或3个,报错了,加减参数就行
findContours(image, mode, method, contours=None, hierarchy=None,
offset=None)
mode
参数名称 | 功能 |
---|---|
cv2.RETR_EXTERNAL | 只检测外轮廓 |
cv2.RETR_LIST | 检测的轮廓不建立等级关系,都是同级 |
cv2.RETR_CCOMP | 建立两个等级的轮廓,上面一层为外边界,里面一层为内孔的边界信息 |
cv2.RETR_TREE | 建立一个等级树结构的轮廓 |
method
参数名称 | 功能 |
---|---|
cv2.CHAIN_APPROX_NONE | 存储所有边界点 |
cv2.CHAIN_APPROX_SIMPLE | 压缩垂直、水平、对角方向,只保留端点 |
cv2.CHAIN_APPROX_TX89_L1 | 使用teh-Chini近似算法 |
cv2.CHAIN_APPROX_TC89_KCOS | 使用teh-Chini近似算法 |
contours
图像轮廓点。列表格式,每一个元素为一个3维数组
hierarchy
轮廓间的层次关系是三维数组,形状为(1,n,4),其中n表示轮廓总个数,4指的是用4个数表示各轮廓间的相互关系。第一个数表示同级轮廓的下一个轮廓编号,第二个数表示同级轮廓的上一个轮廓的编号,第三个数表示该轮廓下一级轮廓的编号,第四个数表示该轮廓的上一级轮廓的编号。
offset
轮廓点的偏移量,格式为tuple,如(-1,1)表示轮廓点沿X负方向偏移1个像素点,沿Y正方向偏移1个像素点(这个参数一般可以不选)
返回值
(任意名称), contours,hierarchy 版本不同第一个参数根据版本来进行修改
cv2.drawContours()
cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)
image
注意要是三通道函数,可以调用原图像的复制图像
contourIdx
指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓
其余函数较为简单,代码又简单注释,感兴趣想要深入了解可以网上搜寻一下
最终代码
import cv2
import numpy as np
def stackImages(scale,imgArray): # 堆栈操作
rows = len(imgArray)
cols = len(imgArray[0])
rowsAvailable = isinstance(imgArray[0], list)
width = imgArray[0][0].shape[1]
height = imgArray[0][0].shape[0]
if rowsAvailable:
for x in range(0, rows):
for y in range