Win10+OpenCV4.5 无法正常读取USB摄像头数据解决方案

借鉴了这个博客。

采用OpenCV中的VideoCapture类获取USB摄像头的数据时,使用下列代码

#include "pch.h"
#include "highgui.hpp"
#include "imgproc.hpp"
#include "time.h"
#include "windows.h"
#include 
#include 
#include "videoio.hpp"
#include "video.hpp"

using namespace cv;
using namespace std;

int main(int argc, const char** argv)
{
	VideoCapture cap(1);
	if (!cap.isOpened())
	{
		cout << "***Could not initialize capturing...***\n";
		cout << "Current parameter's value: \n";
		return -1;
	}

	Mat frame;
	for (;;)
	{
		cap >> frame;
		if (frame.empty())
			break;
		flip(frame, frame, 1);

		imshow("CamShift Demo", frame);
		char c = (char)waitKey(10);
		if (c == 27)
			break;
		if (c == 's')
			imwrite("capture.jpg", frame);
	}
	return 0;
}

代码在Win7+VS2015下可以正常读取USB摄像头中的数据,但是在Win10系统下发现摄像头能打开,但无法正常获取数据,出现如下提示[ WARN:1] videoio(MSMF): can’t grab frame. Error: -2147483638。查阅相关资料以及经过多次尝试后发现,声明语句应修改为:

VideoCapture cap(1,CAP_DSHOW);

运行后发现USB摄像头可以正常读取数据了,但是卡顿现象严重,因此,在此基础上又加入了下列代码,提高摄像头读取视频数据的流畅性。

VideoStream.set(CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
VideoStream.set(CAP_PROP_FRAME_WIDTH, 640);
VideoStream.set(CAP_PROP_FRAME_HEIGHT, 480);

然后在Win10系统下可以用OpenCV流畅的读取USB摄像头的数据,问题解决。

究其原因是为什么呢?
看这里

在抓取视频时 输入的是MSMF参数, Microsoft Media Foundation,
实际上错误提示上都显示了。[ WARN:1] videoio(MSMF): can’t grab frame. Error: -2147483638。
换成 CAP_DSHOW就好了。
看来是opencv修改了默认参数。有兴趣的可以跟踪一下。

你可能感兴趣的:(opencv)