Python OpenCV 影像处理:读取、显示、储存影片

► 前言

本篇将介绍使用OpenCV Python撷取网路摄影机(webcam)的即时画面影像处理与显示,以及透过读取、显示和储存硬盘中的影片档案来实现影片操作。这将帮助大家了解如何使用OpenCV在影片上进行各种操作。

► OpenCV Python撷取网路摄影机

OpenCV首先建立了一个VideoCapture物件,指定了网路摄影机的索引,使用再透过 cap.isOpened() 来判断影片是否正常开启,正常开启会回传 True,失败则是 False。能够正常开启后进入一个无穷回圈,每次回圈透过函数read从摄影机中读取一帧影像,再于视窗上进行显示。其中还可以透过cap.get(propID): 获取影片的属性值以及cap.set(propID, value): 设置影片的属性值。

import cv2
# 使用网路摄影机的预设索引(通常为0)
camera_index = 0
# 建立VideoCapture物件,指定网路摄影机的索引
cap = cv2.VideoCapture(camera_index)
# 检查摄影机是否成功开启
if not cap.isOpened():
print("无法开启摄影机")
exit()
# 设定摄影机属性,例如帧宽度和帧高度
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# 获取摄影机属性值,例如帧宽度和帧高度
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print("摄影机帧宽度:", width)
print("摄影机帧高度:", height)
while True:
# 读取当前帧的影像
ret, frame = cap.read()
# 检查是否成功读取影像
if not ret:
print("无法读取影像")
break
# 显示当前帧的影像
cv2.imshow("Webcam", frame)
# 按下Esc键退出回圈
if cv2.waitKey(1) == 27:
break
# 释放摄影机资源并关闭视窗
cap.release()
cv2.destroyAllWindows()



► OpenCV Python
 
读取与显示影片
OpenCV读取影片只需要在cv2.VideoCapture中传入的参数从camera index 改为影片档案位置,(档案相对路径、绝对路径都可以),就可以进行OpenCV 读取硬盘中的影片操作了。
import cv2
# 影片档案的路径
video_path = 'path/to/your/video/file.mp4'
# 建立VideoCapture物件,指定影片档案路径
cap = cv2.VideoCapture(video_path)
# 检查影片是否成功开启
if not cap.isOpened():
print("无法开启影片档案")
exit()
# 设定影片属性,例如帧宽度和帧高度
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# 获取影片属性值,例如帧宽度和帧高度
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print("影片帧宽度:", width)
print("影片帧高度:", height)
while True:
# 读取当前帧的影像
ret, frame = cap.read()
# 检查是否成功读取影像
if not ret:
print("影片读取完成或无法读取影像")
break
# 显示当前帧的影像
cv2.imshow("Video Playback", frame)
# 按下Esc键退出回圈
if cv2.waitKey(1) == 27:
break
# 释放影片资源并关闭视窗
cap.release()
cv2.destroyAllWindows()

► OpenCV Python 储存影片

OpenCV使用以下函数(cv2.VideoWriter) 将影像帧序列写入为影片档案,透过以下参数进行相关设定。

filename:指定储存的影片档案路径,例如 "output/video.mp4"。
fourcc:指定影片的编码方式,使用四个字符的代码。常见的几种编码方式包括:
MP4V:MP4编码(需要安装MPEG-4编码库)。
XVID:XVID编码(需要安装XVID编码库)。
MJPG:Motion-JPEG编码。
fps:指定影片的帧率(每秒的帧数),例如 30 表示每秒 30 帧。
frameSize:指定影片的帧尺寸,可以是 (width, height) 的元组或整数值。
isColor:指定是否要储存彩色影像。预设为True。

最后将上面的撷取网路摄影机与储存影片组合,就可以透过OpenCV进行影片的读取、显示与储存。

import cv2
# 设定网路摄影机索引,0表示第一个网路摄影机
camera_index = 0
# 建立VideoCapture物件,指定网路摄影机索引
cap = cv2.VideoCapture(camera_index)
# 设定影片的储存器
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 使用MP4编码
output_path = 'path/to/save/output/video.mp4'
fps = 30 # 帧率
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
while True:
# 读取当前帧的影像
ret, frame = cap.read()
# 检查是否成功读取影像
if not ret:
print("无法读取影像")
break
# 显示当前帧的影像
cv2.imshow("Camera", frame)
# 储存当前帧的影像到输出影片
out.write(frame)
# 按下Esc键退出回圈
if cv2.waitKey(1) == 27:
break
# 释放资源并关闭视窗
cap.release()
out.release()
cv2.destroyAllWindows()​

►Q&A 

问题一:为甚么读取图像错误?

在读取图像时,如果指定的图像路径不正确,将无法读取图像。因此,要确保提供正确的路径和档案名称。建议采用全英文路径进行读取。
问题二:影像分辨率不正确

网路摄影机可能支援多种分辨率,但程式码中可能未正确设定所需的分辨率。确保程式码中的分辨率设定与摄影机的
支援分辨率相匹配,以获得正确的影像分辨率。
问题三:影像变形或畸变

网路摄影机可能具有广角或鱼眼镜头,这可能导致影像变形或畸变。在显示或储存影像之前,
你可能需要进行校正或去除畸变的处理。这可以通过适当的校正技术,如相机校正或鱼眼校正,来实现。
问题四:影片播放速度问题

在读取和显示影片时,可能会遇到播放速度不正确的问题,导致影片过快或过慢。这可能是由于设定的帧率不正确或影片本身的帧率不匹配所引起。
检查帧率设定,确保它与影片的实际帧率相符。
问题五:影片编码问题

在储存影片时,可能会遇到编码问题,导致储存的影片无法正常播放或读取。这可能是由于使用不支援的编码方式或编码参数设定不正确所引起。
确保选择适当的编码方式并正确设定编码参数,以确保储存的影片能够顺利播放和读取。


► 小结

透过以上讲解,搭配程式码进行范例讲解与Q&A进行问题解惑,相信各位对于OpenCV撷取网路摄影机的即时画面影像处理与显示,以及透过读取、显示和储存硬盘中的影片档案来实现影片操作能有更深刻的理解,期待下一篇博文吧!

参考资料    

OpenCV - Open Computer Vision Library


★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论