OpenCV调用USB摄像头/相机,并解决1080p下的延迟卡顿问题(附Python代码)

文章目录

    • 1. 加载摄像头
    • 2. 高分辨率视频流延迟问题
    • 3. 延迟解决方案

      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默认分辨率的帧率一样,及其流畅,几乎无延迟

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

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

          #!/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()