赞
踩
本篇将介绍使用OpenCV Python撷取网路摄影机(webcam)的即时画面影像处理与显示,以及透过读取、显示和储存硬盘中的影片档案来实现影片操作。这将帮助大家了解如何使用OpenCV在影片上进行各种操作。
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读取影片只需要在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使用以下函数(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进行问题解惑,相信各位对于OpenCV撷取网路摄影机的即时画面影像处理与显示,以及透过读取、显示和储存硬盘中的影片档案来实现影片操作能有更深刻的理解,期待下一篇博文吧!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。