D01 - 视频处理
使用 opencv 从摄像头连续读取图像
OpenCV 读写视频?
- VideoCapture 类用于读取视频文件、视频流或从摄像机捕获视频,VideoWriter 类用于视频文件的写入和保存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#capRead = cv2.VideoCapture('.../Cars.mp4') # 从文件读取
capRead = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 从摄像头读取,0 为设备索引号
#capRead = cv2.VideoCapture('.../Image_sequence/Cars%04d.jpg') # 从图片序列中读取
# 设置写入视频图像的高,宽,帧速率和总帧数
width = int(capRead.get(cv.CAP_PROP_FRAME_WIDTH)) # 960
height = int(capRead.get(cv.CAP_PROP_FRAME_HEIGHT)) # 540
fps = round(capRead.get(cv.CAP_PROP_FPS)) # 30
frameCount = int(capRead.get(cv.CAP_PROP_FRAME_COUNT)) # 1826
print(height, width, fps, frameCount)
# 创建写入视频对象
# fourcc = cv.VideoWriter_fourcc('X', 'V', 'I', 'D') # 编码器设置 XVID
fourcc = cv.VideoWriter_fourcc(*'XVID') # 'X','V','I','D' 简写为 *'XVID'
vedioWrite = "../images/nasa.avi" # 写入视频文件的路径
capWrite = cv.VideoWriter(vedioWrite, fourcc, fps, (width, height))
# 读取视频文件,抽帧写入视频文件
frameNum = 0 # 视频帧数初值
timef = 30 # 设置抽帧间隔
while capRead.isOpened(): # 检查视频捕获是否成功
ret, frame = capRead.read() # 读取下一帧视频图像
if ret is True:
frameNum += 1 # 读取视频的帧数
cv.imshow(vedioRead, frame) # 播放视频图像
if (frameNum % timef == 0): # 判断抽帧条件
capWrite.write(frame) # 将当前帧写入视频文件
if cv.waitKey(1) & 0xFF == ord('q'): # 按 'q' 退出
break
else:
print("Can't receive frame at frameNum {}".format(frameNum))
break
多帧图像(动图)的读取与保存?
- 多帧图像是将多幅图像或帧数据保存在单个文件中,也称为多页图像或图像序列,主要用于对时间或场景上相关图像集合进行操作的场合。例如,时间序列图像是动态图像(动图),可以形成简单的动画效果;计算机 X 线断层扫描图像 (CT)是空间序列图像。常用的多帧图像格式有 GIF、PNG、TIFF
- 函数 cv. Imreadmulti () 用于从指定的多帧图像文件中读取多幅图像
1
2
3
4
5
6
7
8
9
10
11
12# 读取多帧图像文件1
imgMulti = cv.imreadmulti("../images/imgList.tiff") # 读取多帧图像文件
print("len(imgList): ", len(imgList)) # imgList 是列表
# 读取多帧图像文件2
img1 = cv.imread("../images/FVid1.png") # 读取彩色图像 FVid1.png
img2 = cv.imread("../images/FVid2.png") # 读取彩色图像 FVid2.png
img3 = cv.imread("../images/FVid3.png") # 读取彩色图像 FVid3.png
img4 = cv.imread("../images/FVid4.png") # 读取彩色图像 FVid4.png
imgList = [img1, img2, img3, img4] # 生成多帧图像列表
# 保存为多帧图像文件
saveFile = "../images/imgList.tiff" # 保存文件的路径
ret = cv.imwritemulti(saveFile, imgList)
OpenCV 同时读取两个摄像头的视频流?
- Cv 2. VideoCapture 初始化时,指定摄像头即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# 使用不同摄像头初始化两个cv2.VideoCapture对象
cap0 = cv2.VideoCapture(0)
cap1 = cv2.VideoCapture(1)
ret = cap0.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
ret = cap0.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
ret = cap1.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
ret = cap1.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
while cap0.isOpened() and cap1.isOpened():
ret0, frame0 = cap0.read()
ret1, frame1 = cap1.read()
if ret0:
cv2.imshow('frame0', frame0)
cv2.setWindowTitle('frame0','On Top')
if ret1:
cv2.imshow('frame1', frame1)
cv2.moveWindow('frame1', x=320, y=40)
key = cv2.waitKey(delay=2)
if key == ord("q"):
break
参考: