OpenCV调用USB摄像头/相机,并解决1080p下的延迟卡顿问题(附Python代码)
短信预约 -IT技能 免费直播动态提醒
文章目录
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 : PyCharmimport cv2 as cvif __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默认分辨率的帧率一样,及其流畅,几乎无延迟
具体啥愿意就不知道了,希望有大佬可以解答一下~
下面放上完整代码供参考:
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2023/5/16 10:22# @Author : Chenan_Wang# @File : cv_test.py# @Project : pad_det # @Software : PyCharmimport cv2 as cvif __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()
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341