解决OpenCV使用USB摄像头获取高分辨率视频低帧率、卡、果冻画面的问题

最近制作移动设备,需要安置多个usb摄像头到电脑,踩了几个坑,记录一下解决方案。

  1. 不能使用分线器插多个usb摄像头,同一时间只能加载一个。
  2. 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设置与摄像头支持分辨率不符,摄像头不支持的话,按照摄像头的为准,不会卡。

 

 

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值