1. 加载摄像头
首先直接放上一段加载USB相机的例程供参考
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/5/16 10:22
# @Author : Chenan_Wang
# @File : cv_test.py
# @Project : pad_det
# @Software : PyCharm
import cv2 as cv
if __name__ == "__main__":
cap = cv.VideoCapture()
cap.open(1, cv.CAP_DSHOW) # 我这里0为电脑自带摄像头,1为外接相机
while True:
if not cap.isOpened():
print('can not open camera')
break
ret, frame = cap.read() # 读取图像
if not ret: # 图像读取失败则直接进入下一次循环
continue
cv.namedWindow("cv_test")
cv.imshow('cv_test', frame)
my_key = cv.waitKey(1)
# 按q退出循环,0xFF是为了排除一些功能键对q的ASCII码的影响
if my_key & 0xFF == ord('q'):
break
#释放资源
cap.release()
cv.destroyAllWindows()
2. 高分辨率视频流延迟问题
摄像头成功加载出来,但是默认分辨率太低(我的相机支持的是1080p),通过如下代码设置分辨率和帧率:
cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080)
cap.set(cv.CAP_PROP_FPS, 30)
此时分辨率是1080p了,但是延迟严重,在网上找了一堆方法,几乎都不可用!!!:
- 设置格式为MJPG:
cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc('M', 'J', 'P', 'G'))
==> 无法解决问题,依然有延迟
-
开启多线程接受图像信息,依然无法解决问题,延迟依旧
-
发现修改为低分辨率的时候卡顿会降低,推测可能是由于分辨率太高导致的延迟现象,但是理论上来说这点算力对计算机是没影响的,结果在修改分辨率的时候突然问题就解决了 ↓
3. 延迟解决方案
设置分辨率的时候不要设置为1920x1080,改成1900x1080!,实际成像依然会匹配相机的1920x1080,保存的时候也是1920x1080
而且画面会和之前cv默认分辨率的帧率一样,及其流畅,几乎无延迟
具体啥愿意就不知道了,希望有大佬可以解答一下~文章来源:https://www.toymoban.com/news/detail-484569.html
下面放上完整代码供参考:文章来源地址https://www.toymoban.com/news/detail-484569.html
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/5/16 10:22
# @Author : Chenan_Wang
# @File : cv_test.py
# @Project : pad_det
# @Software : PyCharm
import cv2 as cv
if __name__ == "__main__":
cap = cv.VideoCapture()
cap.open(1, cv.CAP_DSHOW) # 我这里0为电脑自带摄像头,1为外接相机
cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc('M', 'J', 'P', 'G'))
cap.set(cv.CAP_PROP_FRAME_WIDTH, 1900) # 解决问题的关键!!!
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080)
cap.set(cv.CAP_PROP_FPS, 30)
while True:
if not cap.isOpened():
print('can not open camera')
break
ret, frame = cap.read() # 读取图像
if not ret: # 图像读取失败则直接进入下一次循环
continue
cv.namedWindow("cv_test")
cv.imshow('cv_test', frame)
my_key = cv.waitKey(1)
# 按q退出循环,0xFF是为了排除一些功能键对q的ASCII码的影响
if my_key & 0xFF == ord('q'):
break
#释放资源
cap.release()
cv.destroyAllWindows()
到了这里,关于OpenCV调用USB摄像头/相机,并解决1080p下的延迟卡顿问题(附Python代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!