openCV打开高清摄像头卡顿的问题
cv2.VideoCapture(camera_number + cv2.CAP_DSHOW) 是OpenCV在Windows平台下用于指定使用DirectShow作为视频捕获后端的一种方式。这里的 cv2.CAP_DSHOW 是一个常量,表示使用DirectShow(DirectX Show)技术来访问和控制摄像头。
cv2.CAP_DSHOW 参数含义:
当你将 cv2.CAP_DSHOW 与摄像头编号相加时,实际上是告诉OpenCV使用DirectShow框架来打开并操作指定的摄像头设备。
DirectShow是Windows操作系统中用于处理音/视频流的一种API集合,它可以动态构建数据源到渲染器之间的过滤器链,支持多种音频和视频格式,并具有一定的硬件加速能力。
可替换参数及其意义: 在OpenCV中,针对不同的系统和摄像头类型,可以设置不同的视频捕获后端。对于不同平台,VideoCapture构造函数可以接受以下几种类型的捕获器标识符:
cv2.CAP_ANY (默认值): OpenCV会选择系统的默认捕获设备或框架。在Windows上可能优先选择VFW (Video for Windows) 或者 DirectShow。
cv2.CAP_VFW (仅限Windows): 使用Video for Windows API。
cv2.CAP_V4L / cv2.CAP_V4L2 (Linux): 使用Video4Linux (V4L) 或 Video4Linux2 (V4L2) 驱动接口。
cv2.CAP_FIREWIRE (某些Linux发行版): 使用IEEE 1394(火线)接口。
cv2.CAP_DC1394 (某些Linux和Mac OS X): 使用IIDC 1394 DC (Digital Camera) 规范。
cv2.CAP_CMU1394 (某些旧版本的OpenCV,现已弃用): 另一种对1394火线相机的支持。
cv2.CAP_QT / cv2.CAP_GSTREAMER / cv2.CAP_FFMPEG 等: 在特定环境中使用其他捕获框架。
请注意,不是所有平台都支持上述所有选项,实际可用的选项取决于您安装的OpenCV版本以及目标操作系统的支持情况。在尝试使用这些选项前,请确保它们在您的环境下有效且适用。
import time
import numpy as np
import cv2
def video_hd():
"""
问题:opencv-python 在2k采集模式下,画面卡顿厉害,而且录制成功后出现加速播放的效果,实际时常和录制时长相差太大
调研:很多摄像头在高分辨率的情况下都不到15帧,以MJPG格式解码能达到30帧。
:return:
"""
start = int(time.time())
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) # 设置宽为1920
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) # 设置高为1080
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG')) # 使用设摄像头录制高清视频的时候一定要设置为MJPG,别的格式无法支持高清
fourcc = cv2.VideoWriter_fourcc(*'MJPG') # 保持的格式
out = cv2.VideoWriter('{}.avi'.format(str(start)), fourcc, 30.0, (1920, 1080))
print("按字母 q 结束录制")
time1 = time.time()
while cap.isOpened():
step = int(time.time())
ret, frame = cap.read()
if ret == True:
out.write(frame)
cv2.imshow('frame', frame)
if (cv2.waitKey(1) & 0xFF == ord('q')):
print(f"花费的时间 {time.time() - time1}")
break
else:
break
# 资源释放,在录制结束后,我们要释放资源:
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
video_hd()