最近制作移动设备,需要安置多个usb摄像头到电脑,踩了几个坑,记录一下解决方案。
- 不能使用分线器插多个usb摄像头,同一时间只能加载一个。
- usb摄像头调高分辨率时,非常卡顿,视频画面像果冻一样,及不流畅
第二个情况具体描述:
摄像头支持1920*1080 60fps,opencv在videocapture后,设置了MJPG和视频尺寸,但依然很卡。
cv::VideoCapture cap1(1);
int codec = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');//无法改善!!!!!
cap1.set(cv::CAP_PROP_FOURCC, codec);//无法改善!!!!!
cap1.set(cv::CAP_PROP_FRAME_WIDTH, 1920);
cap1.set(cv::CAP_PROP_FRAME_HEIGHT, 1080);
cap1.set(cv::CAP_PROP_FPS, 60);//无法改善!!!!!
看到博客说要设置MJPG,并且要用一个变量接收cv::VideoWriter::fourcc('M', 'J', 'P', 'G'),再set(cv::CAP_PROP_FOURCC, codec),没用!!!!
解决方案:
只需要将想要的分辨率降低,例如需要1920*1080,分辨率调整为1560*1080,但摄像头/电脑会自动设置为与摄像头的默认分辨率档位相近的1920*1080,即可非常流畅运行!我电脑两个usb摄像头720p都卡,现在两个1080p不卡,没测帧率,肉眼观测最起码高于30fps,且无果冻情况。
cv::VideoCapture cap1(1);
int codec = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');
cap1.set(cv::CAP_PROP_FOURCC, codec);
cap1.set(cv::CAP_PROP_FRAME_WIDTH, 1560);//降低纵向像素点1920>1560
cap1.set(cv::CAP_PROP_FRAME_HEIGHT, 1080);//固定横向像素点1080
cap1.set(cv::CAP_PROP_FPS, 60);
需要注意的是,1920>1560,这个1560不能太低,不能过于接近/等于1280,这样会自动降低分辨率到1280*720(这个是我的usb摄像头支持的更低一档的分辨率),所以调整分辨率的时候,只需要控制横向像素点,然后把纵向像素点控制在摄像头支持的不同分辨率档位之间但接近高一档的分辨率像素。
总结:估计是opencv设置视频采集格式与摄像头一致时会冲突,导致视频采集出问题;如果opencv设置与摄像头支持分辨率不符,摄像头不支持的话,按照摄像头的为准,不会卡。
文章来源地址https://www.toymoban.com/news/detail-597010.html文章来源:https://www.toymoban.com/news/detail-597010.html
到了这里,关于解决OpenCV使用USB摄像头获取高分辨率视频低帧率、卡、果冻画面的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!