用OpenCV进行USB摄像头调用,并解决1080p下延迟卡顿问题的学习笔记

用OpenCV进行USB摄像头调用,并解决1080p下延迟卡顿问题的学习笔记 愚人陆陆 2023-06-03 13:58:35 730
1. 加载摄像头

首先直接放上一段加载USB相机的例程供参考

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 2023/5/16 10:22
  4. # @Author : Chenan_Wang
  5. # @File : cv_test.py
  6. # @Project : pad_det
  7. # @Software : PyCharm
  8. import cv2 as cv
  9. if __name__ == "__main__":
  10. cap = cv.VideoCapture()
  11. cap.open(1, cv.CAP_DSHOW) # 我这里0为电脑自带摄像头,1为外接相机
  12. while True:
  13. if not cap.isOpened():
  14. print('can not open camera')
  15. break
  16. ret, frame = cap.read() # 读取图像
  17. if not ret: # 图像读取失败则直接进入下一次循环
  18. continue
  19. cv.namedWindow("cv_test")
  20. cv.imshow('cv_test', frame)
  21. my_key = cv.waitKey(1)
  22. # 按q退出循环,0xFF是为了排除一些功能键对q的ASCII码的影响
  23. if my_key & 0xFF == ord('q'):
  24. break
  25. #释放资源
  26. cap.release()
  27. cv.destroyAllWindows()
2. 高分辨率视频流延迟问题

摄像头成功加载出来,但是默认分辨率太低(我的相机支持的是1080p),通过如下代码设置分辨率和帧率:

  1. cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920)
  2. cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080)
  3. cap.set(cv.CAP_PROP_FPS, 30)

此时分辨率是1080p了,但是延迟严重,在网上找了一堆方法,几乎都不可用!!!

  • 设置格式为MJPG:
  1. cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc('M', 'J', 'P', 'G'))

无法解决问题,依然有延迟

  • 开启多线程接受图像信息,依然无法解决问题,延迟依旧
  • 发现修改为低分辨率的时候卡顿会降低,推测可能是由于分辨率太高导致的延迟现象,但是理论上来说这点算力对计算机是没影响的,结果在修改分辨率的时候突然问题就解决了
3. 延迟解决方案

设置分辨率的时候不要设置为1920x1080,改成1900x1080!,实际成像依然会匹配相机的1920x1080,保存的时候也是1920x1080

而且画面会和之前cv默认分辨率的帧率一样,及其流畅,几乎无延迟

具体啥原因就不知道了,希望有大佬可以解答一下~

下面放上完整代码供参考:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 2023/5/16 10:22
  4. # @Author : Chenan_Wang
  5. # @File : cv_test.py
  6. # @Project : pad_det
  7. # @Software : PyCharm
  8. import cv2 as cv
  9. if __name__ == "__main__":
  10. cap = cv.VideoCapture()
  11. cap.open(1, cv.CAP_DSHOW) # 我这里0为电脑自带摄像头,1为外接相机
  12. cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc('M', 'J', 'P', 'G'))
  13. cap.set(cv.CAP_PROP_FRAME_WIDTH, 1900) # 解决问题的关键!!!
  14. cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080)
  15. cap.set(cv.CAP_PROP_FPS, 30)
  16. while True:
  17. if not cap.isOpened():
  18. print('can not open camera')
  19. break
  20. ret, frame = cap.read() # 读取图像
  21. if not ret: # 图像读取失败则直接进入下一次循环
  22. continue
  23. cv.namedWindow("cv_test")
  24. cv.imshow('cv_test', frame)
  25. my_key = cv.waitKey(1)
  26. # 按q退出循环,0xFF是为了排除一些功能键对q的ASCII码的影响
  27. if my_key & 0xFF == ord('q'):
  28. break
  29. #释放资源
  30. cap.release()
  31. cv.destroyAllWindows()
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
愚人陆陆
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区