本博文主要记录在python3编程环境下常用的一些opencv3函数,可根据左侧的目录选择自己需要使用的函数说明。
1图像的读取、分割以及保存
import cv2 import numpy as np img = cv2.imread('test.jpg') # 读入一张图片,注意Opencv彩色图像排序是BGR im_height, im_width, im_dep = img.shape # 获取图像的高,宽以及深度。若图像是灰度或二值只返回高和宽 img_size = img.size # 返回图像的像素数目,高x宽x深度 ROI = img[10:100, 20:50, :] # 提取ROI,10:100表示提取原图的第10行到第100行 # 20:50表示提取原图的第20列到第50列 # 第三个参数:表示提取所有通道,若只提取G通道则为1 cv2.imwrite('ROI_image.jpg',ROI) # 保存图片
2摄像头、视频的读取以及保存
2.1摄像头的打开与读取
import cv2 import numpy as np cap = cv2.VideoCapture(0) # 打开内置摄像头,设置成1或者其他值来调用其他摄像头 if cap.isOpened() is False: # 确认摄像头是否成功打开 print('Error') exit(1) while True: ret, frame = cap.read() cv2.imshow('frame', frame) # 显示图像帧 if cv2.waitKey(20) & 0xFF == ord('q') # 每隔20ms采集一帧,按q键退出采集 break cap.release()
2.2视频文件的读取与保存
import cv2 import numpy as np cap = cv2.VideoCapture('video.mp4') # 打开视频文件 if cap.isOpened() is False: # 确认视频是否成果打开 print('Error') exit(1) frame_width = int(cap.get(3)) # 获取图片帧宽度 frame_height = int(cap.get(4)) # 获取图像帧高度 # 创建保存视频,指定保存视频名称,指定视频编码器,视频帧率,图像帧尺寸 out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frame_width, frame_height)) ret, frame = cap.read() # 读取一帧图像,当视频帧读取完毕ret标识符为False while ret: cv2.imshow('frame', frame) # 显示图像帧 cv2.waitKey(20) # 帧间隔为20ms frame = cv2.flip(frame, 0) # 对图像进行水平翻转 out.write(frame) # 将frame写入视频 ret, frame = cap.read() # 读取下一帧 cap.release() out.release()
3图像轮廓相关函数
3.1获取轮廓函数findCountours
import numpy as np import cv2 im = cv2.imread('test.jpg') # 读入图片 imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # 图像灰度化 ret, thresh = cv2.threshold(imgray, 200, 255, cv2.THRESH_BINARY) # 图像二值化 image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 获取轮廓
返回的image是绘制了边框后的图像,findContours的第二个函数主要有:cv2.RETR_LIST, cv2.RETR_CCOMP, cv2.RETR_EXTERNAL可控选择
3.2绘制轮廓函数drawContours
cv2.drawContours(image, contours, -1, (255, 0, 0), 3) # 将所有轮廓全都绘制到image上, # 若image是灰度或者二值图像将(255,0,0)改为任意灰度值,如200 cv2.drawContours(image, [contours[i]], -1, (255, 0, 0), 3) # 只绘制其中某一个轮廓
3.3绘制轮廓外接矩形框
绘制轮廓的外界矩形框有两个算法,一个是不带旋转的,一个是带旋转的(最小面积外接矩形框)。如下图所示,黑色代表目标,红色的矩形框是不带旋转的,橙色的带旋转的。3.3.1 不带旋转的外接矩形框
x, y, w, h = cv2.boundingRect(contour) # contour为一轮廓点集 cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
3.3.2 带旋转的外接矩形框
rect = cv2.minAreaRect(contour) # 得到的是最小外界矩形框的中心点坐标(x,y),(宽度,高度),旋转角度 box = cv2.boxPoints(rect) # 将rect转换成最小外接矩形的四个顶点[x0, y0], [x1, y1], [x2, y2], [x3, y3] box = np.int0(box) # float转int,注意int0这个函数虽然没有参考文档但可以直接使用 cv2.drawContours(img, [box], -1, (255, 0, 0), 2)