写点什么

Python+Opencv 读取高帧率 USB 摄像头问题

作者:虫无涯
  • 2023-02-17
    陕西
  • 本文字数:2204 字

    阅读完需:约 7 分钟

前几次使用 Python+Opencv,对网络摄像头,USB 摄像头进行数据采集,基本流程已经跑通,没什么大问题。最近项目中使用了一款 120fps/s 的 USB 摄像头,但是调试好代码运行后,问题来了。

遇到的问题

120fps,每次只能读取 30 多张图片或者最多也在 40 张以下。根本达不到要求。

开始使用的代码

# -*- coding: cp936 -*-"""Author:NoamaNelsonDate:2019-11-19Discription:Read Camaro picture and save """
import cv2,os,timeimport numpy as np
class CamaroCap(object):
""" 打开视频流 """ def __init__(self):
self.cap = cv2.VideoCapture(0)
""" 图片信息打印 """ def get_image_info(self,image): print(type(image)) print(image.shape) print(image.size) print(image.dtype) pixel_data = np.array(image) print(pixel_data)
""" 逐帧读取数据并保存图片到本地制定位置 """ def Camaro_image(self): i = 0 while(True): ret,frame = self.cap.read() #ret:True或者False,代表有没有读取到图片;frame:表示截取到一帧的图片 if ret == False: break self.get_image_info(frame) # print("打印图片信息") 注意:调试的时候可以打开,如果是一直运行程序,建议把这行代码注释掉,避免影响内存占用 cv2.imshow('capture',frame) # 展示图片 cv2.imwrite(r"D:\image\\"+ str(i) + ".jpg",frame) # 保存图片 i = i + 1
if cv2.waitKey(1) & 0xFF == ord('q'): # break
if __name__ == '__main__':
outmasages = CamaroCap() outmasages.Camaro_image() # 调用摄像头 outmasages.cap.release() # 释放对象和销毁窗口 cv2.destroyAllWindows()
复制代码

问题分析

  • 笔者发现,每次在摄像头的控制软件上调参数,比如分辨率设置 800600,但是运行代码后依然是 640480,why?why?

  • 该摄像头在 640*480 分辨率下,支持 120fps,笔者在代码中限制了下帧率为 60fps,但还是每秒只能获取 30 多张图片,这又是 Why?why?


self.cap.set(cv2.CAP_PROP_FPS, 60)
复制代码


  • 开始求助网络,从网上搜了很多,终于是看到了希望

  • 原来以上问题在于,博主链接

分析结论


笔者使用的 USB 相机,同样支持视频编码格式为 YUY2/MJPG,但是 Opencv 默认读取的是 YUY2,而笔者在摄像头控制软件上查看了下,YUY2 格式的各种分辨率下的帧率最大才 40 帧,那么这就对了,就知道为啥一直是 30-40 张图片了。那么就需要在脚本中修改格式为 MJPG,从以上博主的链接中可以看到:


  • 如果要修改分辨率就必须使用:


CAP_PROP_FRAME_WIDTH 和 CAP_PROP_FRAME_HEIGHT进行设置宽和高
复制代码


  • 要修改格式为 MJPG 编码必须使用:


CV_CAP_PROP_FOURCC
复制代码


  • 那么就需要在代码中加入:


#self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)#self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)#self.cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
复制代码

修改后的代码

# -*- coding: cp936 -*-
"""Author:zhangboDate:2019-11-07Discription:Read Camaro picture and save """
import cv2,os,time,datetimeimport numpy as np
class CamaroCap(object):
""" 打开视频流 """ def __init__(self): self.cap = cv2.VideoCapture(0) #self.cap.set(cv2.CAP_PROP_FPS, 120) 这个有时候生效,有时候不生效不知道是什么原因 self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600) self.cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
""" 图片信息打印 """ def get_image_info(self,image): print(type(image)) print(image.shape) print(image.size) print(image.dtype) pixel_data = np.array(image) print(pixel_data)

""" 逐帧读取数据并保存图片到本地制定位置 """ def Camaro_image(self): i = 0 while(True): ret,frame = self.cap.read() #ret:True或者False,代表有没有读取到图片;frame:表示截取到一帧的图片 if ret == False: break #self.get_image_info(frame) # print("打印图片信息") 注意:调试的时候可以打开,如果是一直运行程序,建议把这行代码注释掉,避免影响内存占用 cv2.imshow('capture',frame) # 展示图片
mtime = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S') print(mtime) cv2.imwrite(r"D:\image\\" + str(i) + str("-") + mtime + ".jpg",frame) # 保存图片 i = i + 1
if cv2.waitKey(1) & 0xFF == ord('q'): break if __name__ == '__main__':
outmasages = CamaroCap() outmasages.Camaro_image() # 调用摄像头 outmasages.cap.release() # 释放对象和销毁窗口 cv2.destroyAllWindows()
复制代码


发布于: 刚刚阅读数: 4
用户头像

虫无涯

关注

专注测试领域各种技术研究、分享和交流~ 2019-12-11 加入

CSDN测试领域优质创作者 | CSDN博客专家 | 阿里云专家博主 | 华为云享专家 | 51CTO专家博主

评论

发布
暂无评论
Python+Opencv读取高帧率USB摄像头问题_Python_虫无涯_InfoQ写作社区