系        统:Ubuntu 18.04
语        言:python
问题描述:在使用nanopi(RK3399)时,采用opencv的VideoCapture进行USB摄像头的视频捕捉时,刚开始都可以获取1920×1080分辨率的视频图像,但使用一段时间后,有一天突然获取不了,在调用read函数时均返回False。同时在使用set函数来设置视频格式和分辨率时,返回均为False,说明设置失败。使用guvcview或v4l2-ctl相关命令查看显示有video0和video1(明明我只有一个相机,为什么会有两个video?这个问题我一直每明白),使用cheese可以打开打开1920×1080分辨率的视频图像,但可能格式为YUYV,帧率很低(可能只有5帧),guvcview打开一直失败,报错为获取不到video的控制。尝试多次更换板子和摄像头,但问题依旧。
解决方法:在使用VideoCapture时对底层调用的API进行设置,如下所示,即使用libv4l来获取视频图像
             vs = cv2.VideoCapture(0, apiPreference=cv2.CAP_V4L2)
                    在使用上面这句后,再来使用set设置格式和分辨率都没有问题了。
分析原因:之前我在使用时未设置参数apiPreference,即使用默认参数cv2.CAP_ANY,该参数说明opencv将自动选择并使用第一个可用的底层API。刚开始调用没问题,后来调用失败,有可能是之前系统在自动选择时选对了,后来自动选择时可能因为什么原因选错了(也有可能是其他操作造成的)

参考网页:https://stackoverflow.com/questions/36426826/v4l2-python-streaming-video-mapping-buffers
         https://docs.opencv.org/3.4/d8/dfe/classcv_1_1VideoCapture.html#a85b55cf6a4a50451367ba96b65218ba1
         https://docs.opencv.org/3.4/d4/d15/group__videoio__flags__base.html#ga023786be1ee68a9105bf2e48c700294d

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐