1.Numpy简介
python版的opencv用的容器不同于C++版的Mat,python版的图像容器基本都倚仗numpy,其数据类型如下:
数组属性
#创建一个numpy.array
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
数组操作:
# 将所有轮廓点归到一个点集
conts = []
for i in cnts:
tmp_list = np.squeeze(i).flatten().tolist()
conts += tmp_list
conts = np.array(conts, dtype=np.int32).reshape([-1, 2])
print(conts)
2.创建空白图像
*******************************单通道***************************************
import cv2
import numpy as np
img_mask = np.zeros((src.shape[0], src.shape[1]), np.uint8)
img = np.zeros((10, 10), np.uint8)
# 浅灰色背景
img.fill(200)
cv2.imshow('img', img)
cv2.waitKey(0)
*******************************三通道***************************************
import cv2
import numpy as np
img = np.zeros((10, 10, 3), np.uint8)
# 浅灰色背景
img.fill(200)
cv2.imshow('img', img)
cv2.waitKey(0)
***************************显示图像并设置延时*********************************
def showImg(img0,name0,flg=0):
'''
显示图像
Args:
img0: 图像
name0: 窗口名
flg: 延时参数
'''
cv2.namedWindow(name0,cv2.WINDOW_NORMAL)
cv2.imshow(name0,img0)
if(flg==1):
cv2.waitKey(0)
elif flg>1:
cv2.waitKey(flg)
3.图像mat操作
#图像大小:
h,w,channel=img.shape
#选取ROI
roi=img_mask[y:y+h,x:x+w]
#拼接
img_cat=cv2.hconcat([img_close,img_open])
#感兴趣区域赋值
mask0=np.zeros((img0.shape[0],img0.shape[1]),np.uint8)
seg0=np.zeros((img0.shape[0],img0.shape[1],img0.shape[2]),np.uint8)
cv2.drawContours(mask0, [box], 0, (255),-1 )
seg0[mask0>0]=img0[mask0>0]
4.绘图操作:点、线、图形
#绘制凸包
hulls = []
hull = cv2.convexHull(conts)
hulls.append(hull)
cv2.drawContours(src, hulls, -1, [255, 0, 25], 1)
# center, axes, angle = cv2.fitEllipseAMS(hulls[0])
# cv2.ellipse(src, box=tuple([center, axes, angle]), color=(5, 255, 10), thickness=2)
center, radius = cv2.minEnclosingCircle(hulls[0])
# print(center)
cv2.circle(src, tuple(np.int0(center)), int(radius + 8), (5, 255, 10), 2)
#line
cv2.line(canvas, (300, 0), (0, 300), (0,255,0), 3)
5.轮廓处理
'''
提取轮廓:输入二值图像,返回轮廓数组
'''
def getContour(img):
# 寻找轮廓
con_mask=img.copy()
cnts, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(con_mask, cnts, -1, [0, 0, 255], 1)
# showImg(src,"src")
return cnts
cnts = sorted(contours, key=cv2.contourArea, reverse=True) # 所有轮廓按面积排序
cnt = cnts[0] # 第 0 个轮廓,面积最大的轮廓,(664, 1, 2)
print("shape of max contour:", cnt.shape[0])
# 轮廓近似,epsilon数值越小,越近似
epsilon = 0.08 * cv.arcLength(cnt, True)
approx = cv.approxPolyDP(cnt, epsilon, True)
tmp2 = np.zeros(src.shape, np.uint8)
# 注意,这里approx要加中括号
res3 = cv.drawContours(tmp2, [approx], -1, (250, 250, 255), 1)
cv.imshow('approx', res3)
# 外接图形
x, y, w, h = cv.boundingRect(cnt)
# 直接在图片上进行绘制,所以一般要将原图复制一份,再进行绘制
tmp3 = src.copy()
res4 = cv.rectangle(tmp3, (x, y), (x + w, y + h), (0, 0, 255), 2)