解决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设置与摄像头支持分辨率不符,摄像头不支持的话,按照摄像头的为准,不会卡。

猜你喜欢

转载自blog.csdn.net/weixin_42264818/article/details/130277838
今日推荐