本文主要介绍图像的读取、操作、转换、显示、保存,视频流的获取、显示和保存,以及如何绑定窗口和事件响应函数。
使用函数cv2.imread(filepath, intflags)读入一幅图片
cv2.waitKey(time_of_milliseconds)
import cv2
import numpy as np
#cv2并不是基于OpenCV 2.**开发的,而是为了区别于cv,cv2采用了面向对象的编程方式
## 1.1 图像的读取与保存 ##
img1 = cv2.imread("fahai.png", cv2.IMREAD_GRAYSCALE)#读入后格式numpy.ndarray
cv2.imwrite("fahai_g.png", img1)
#创建array类型图像
img2 = np.zeros((3,3), dtype=np.uint8)
img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
#查看array属性
print(img2.shape, img2[0, 0].size, img2.dtype, type(img2))
#查看颜色空间转换类型
flag = [i for i in dir(cv2) if i.startswith("COLOR_")]
#print(flag)
## 1.2 图像的显示 ##
img3 = cv2.imread("fahai.jpg") #默认以BGR格式
img3[-30:, :30] = np.array([0, 0, 255]) #将左下角30像素方块内换成红色
#显示方式1
while(True): #持续循环显示,直至键入q后退出
cv2.imshow("img3", img3)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#cv2.destroyWindow(windows_name) #销毁单个特定窗口,若不及时销毁窗口,则出现异常
cv2.destroyAllWindows() #销毁全部窗口
#显示方式2
cv2.imshow("img3", img3)
if cv2.waitKey(0): #永久性阻塞,直至键入任意键
cv2.destroyAllWindows()
## 2.1 视频的读取和显示 ##
#创建一个视频读入流对象
cap = cv2.VideoCapture('test.mp4')
assert(cap.isOpened) #检查是否正确打开视频
#创建一个写入流对象,先获取待读取视频的帧率和尺寸
fps = cap.get(cv2.CAP_PROP_FPS)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('my_video1.avi',
cv2.VideoWriter_fourcc('I','4','2','0'), fps, size)
ret, frame = cap.read() #抽取一帧,read()函数返回第一个参数是bool
while(ret and not cv2.waitKey(50)&0xFF==ord('q')):
cv2.imshow("frame", frame)
videoWriter.write(frame) #将这一帧保存下来
ret, frame = cap.read()
cap.release() #及时释放资源
videoWriter.release()
cv2.destroyAllWindows()
## 2.2 摄像头的视频获取和保存 ##
cap = cv2.VideoCapture(0)
assert(cap.isOpened)
fps = 30
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('my_video2.avi',
cv2.VideoWriter_fourcc('I','4','2','0'), fps, size)
ret, frame = cap.read()
tick = 10 * fps
while(ret and tick > 0):
videoWriter.write(frame)
ret, frame = cap.read()
tick -= 1
cap.release()
videoWriter.release() #若不释放资源,则后面会有一段无效帧
cv2.destroyAllWindows()
## 事件响应函数示例1 ##
"""
功能:显示一张图片,若双击左键,则画圆;键入'q'则退出。
"""
import cv2
img4=cv2.imread('fahai.jpg') #读取图片作为背景
#定义画圆事件,如果事件双击左键发生
#则以此时双击的点为原点画一个半径为100px BGR为(255,255,0)粗细为3px的圆圈
def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img4, (x,y), 100, (255,255,0), 3)
# 创建图像与窗口并将窗口与回调函数绑定
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while(not cv2.waitKey(100) == ord('q')): #等待100毫秒 刷新一次显示图像
cv2.imshow('image', img4)
cv2.destroyAllWindows()
## 事件响应函数示例2 ##
"""
功能:调用摄像头录制视频,当鼠标左击,或者键入某个值,则退出视频流的读取和保存
"""
clicked = False
def onMouse(event, x, y, flags, param): #定义事件函数
global clicked
if event == cv2.EVENT_LBUTTONUP:
clicked = True
cv2.namedWindow("myWindow") #创建一个窗口
cv2.setMouseCallback("myWindow", onMouse) #将事件函数与窗口绑定
cap = cv2.VideoCapture(0)
fps = 30
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('myvideo.avi',
cv2.VideoWriter_fourcc('I','4','2','0'), fps, size)
ret, frame = cap.read()
while(ret and not clicked and cv2.waitKey(1)==-1):
cv2.imshow("myWindow", frame)
videoWriter.write(frame)
ret, frame = cap.read()
cap.release()
videoWriter.release()
cv2.destroyAllWindows()
原文:https://www.cnblogs.com/inchbyinch/p/12444316.html