OPENCV USB摄像机使用CV_MSMF与CV_DSHOW打不开的问题

这篇具有很好参考价值的文章主要介绍了OPENCV USB摄像机使用CV_MSMF与CV_DSHOW打不开的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

平台:win 10 笔记本 自带一个摄像头 再外接一个usb双目摄像头
环境:vs2015 +opencv3.4.10/opencv3.6.0

测试 代码:

int camera_test(int argc, char* argv[]) {
	//【1】从摄像头读入视频//这句是关键	
	VideoCapture capture(0);//,cv::CAP_DSHOW, cv::CAP_MSMF or cv::CAP_V4L2.括号内数字为1是调用usb摄像头,为0则是调用电脑自带摄像头
	
	if (!capture.isOpened()) {
		cerr << "ERROR! Unable to open camera\n";
		system("pause");
		return -1;
	}
	VideoWriter writer;
	//int codec = VideoWriter::fourcc('Y', 'U', 'Y', '2');//('M', 'J', 'P', 'G');capture.set(CAP_PROP_FOURCC, cv::VideoWriter::fourcc('Y', 'U', 'Y', '2'))
	if (capture.set(CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'))) {
		cout << "CAP_PROP_FOURCC success\n";
	}
	else{
		cout << "CAP_PROP_FOURCC failed\n";
	}
	// 再次检查是否成功设置了格式
	int fourcc = static_cast<int>(capture.get(cv::CAP_PROP_FOURCC));
	std::cout << "当前视频编码格式: " << fourcc << std::endl;
	//CAP_OPENCV_Y
	int w = 3040;
	int h = 1520;
	//capture.set(CAP_PROP_FPS, 1);
	capture.set(CAP_PROP_FRAME_WIDTH, w);//宽度 
	capture.set(CAP_PROP_FRAME_HEIGHT, h);//高度
	//
	std::cout << "当前视频长宽: " << capture.get(CAP_PROP_FRAME_WIDTH) <<" "<< capture.get(CAP_PROP_FRAME_HEIGHT) << std::endl;
	std::cout << "当前视频帧率: " << capture.get(CAP_PROP_FPS) << std::endl;
	//capture.set(CV_CAP_PROP_FPS, 30);//帧数
	
	

		
	//【2】循环显示每一帧
	while (1)
	{
		Mat frame;  //定义一个Mat变量,用于存储每一帧的图像
		if (!capture.read(frame)) {
			cerr << "ERROR! blank frame grabbed\n";
			break;
		}
		capture >> frame;  //读取当前帧
		imshow("读取视频", frame);  //显示当前帧
		waitKey(30);  //延时30ms
	}
	return 0;
	
}

opencv3.4.10 release结果:

将【1】改为VideoCapture capture(1)打开的是外接usb摄像头,且帧率为30结果为:
CAP_PROP_FOURCC failed
当前视频编码格式: 20
当前视频长宽: 3040 1520
当前视频帧率: 30

将【1】改为VideoCapture capture(1,cv::CAP_MSMF)的结果同上

将【1】改为VideoCapture capture(1,cv::CAP_DSHOW)的结果是打开笔记本自带的摄像头而非外接usb摄像头

将【1】改为VideoCapture capture(0,cv::CAP_DSHOW)的结果是打开外接usb摄像头结果:
CAP_PROP_FOURCC success
当前视频编码格式: 1196444237
当前视频长宽: 3040 1520
当前视频帧率: 0

虽然显示,更改MJPG成功,但是输出的图像帧率极低,应该是没压缩的图像,并非MIPG格式,所以capture.set(CAP_PROP_FOURCC, cv::VideoWriter::fourcc(‘M’, ‘J’, ‘P’, ‘G’)的执行依旧是失败的

opencv3.6.0 debug结果:

将【1】改为VideoCapture capture(0)打开的是外接usb摄像头,且帧率为30结果为:
CAP_PROP_FOURCC success
当前视频编码格式: 1196444237
当前视频长宽: 3040 1520
当前视频帧率: 0

将【1】改为VideoCapture capture(0,cv::CAP_DSHOW)的结果同上

将【1】改为VideoCapture capture(0,cv::CAP_MSMF)的结果:
ERROR! Unable to open camera
请按任意键继续. . .

将【1】改为VideoCapture capture(0,cv::CAP_MSMF)的同上

**文章来源地址https://www.toymoban.com/news/detail-803498.html

结论:

1我所用的相机opencv版本之间的兼容性存在问题,高版本的MSMF并不能使用,opencv3.4.10的MSMF可以使用

这两个版本中,DSHOW相机id号(或camera_number就是摄像头在你电脑上的设备号,0,1,2,…)是和常规认为的是不同的。通常0是笔记本自带的相机,1是外接的相机,但实际上在我的使用中是反的,又加上opencv3.6.0的MSMF的驱动不能使用,导致在使用VideoCapture capture(1)打开相机的时候,会根据优先级尝试调用下一个驱动也就是DSHOW,从而使得在两个版本中使用VideoCapture capture(1)打开的相机是不一样的

两个版本的capture.set(CAP_PROP_FOURCC, cv::VideoWriter::fourcc(‘M’, ‘J’, ‘P’, ‘G’) 的设置都是失效的。在opencv3.3.10中,想要流畅的高帧率视频(画质低一点),就用VideoCapture capture(1,cv::CAP_MSMF),想要无压缩的高画质原图(帧率会很低),就用VideoCapture capture(0,cv::CAP_DSHOW)

解决方法:在更进一步探明并解决这个问题前,暂时使用较低版本的opencv进行开发,使用cv::CAP_MSMF/cv::CAP_DSHOW进行画质和流畅度的切换

**

到了这里,关于OPENCV USB摄像机使用CV_MSMF与CV_DSHOW打不开的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华为高清会议摄像机预置位的使用方法

    一、保存摄像机预置位 预置位保存了摄像机变焦级别、镜头方向等信息。 保存新的预置位时,如果该位置已保存摄像机预置位,新预置位将替换之前已保存的预置位。 操作步骤如下: 1.按遥控器的 键,进入菜单界面。 2.在工具条上选择 ,按遥控器的 键。  3.选择“保

    2023年04月09日
    浏览(45)
  • Unity使用Cinemachine插件实现摄像机跟随和震动

     一、实现跟随 1、在PackageManager添加插件 2、创建Cinemachine的摄像机,我的项目是2D项目所以创建2D摄像机 3、将Player拖拽到Follow和LookAt  4、创建一个空物体,向它添加PolygonCollider2D,调整好可视范围的大小以后在CinemachineVirtuaCamera的Extensions的AddExtensionzhong中选择 把刚才创建的空

    2024年02月15日
    浏览(50)
  • 关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

    目前只测试了与大华摄像机的语音对讲功能,在此记录下对接工程中遇到的问题和收获。 首先我们需要理清下思路: 第一步要熟悉语音对讲的协议流程,下图为国标28181中的参考图: 这里我们可以简化下流程,只参与与摄像机的信令交互,也就是1,2,3,4,5,14,15   17,

    2023年04月26日
    浏览(153)
  • unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)

    用代码实现摄像机简单的震动效果

    2024年02月12日
    浏览(44)
  • 如何使用 After Effects 导出摄像机跟踪数据到 3ds Max

    推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在本教程中,我将展示如何在 After Effects 中跟踪实景场景,然后将相机数据导出到 3ds Max 。 步骤 1 打开 “后效 ”。 打开后效果 步骤 2 转到 合成新合成 以创建新合成。 或者,您可以按  Ctrl-N  键。它打开 合成 设

    2024年02月08日
    浏览(42)
  • 【Unity 摄像机组件】Camera场景摄像机的认识

    OK 同学们好,本节课我们开始学习摄像机创建以及摄像机的属性。 CH3.3 PPT02 摄像机相机是玩家用来观看游戏场景世界的基本设备,当游戏运行的时候,游戏画面就是摄像机看到的画面。 PPT 3一个场景中可以有无数个摄像机,最终游戏运行的画面可能是很多个摄像机拼凑而成。

    2024年02月02日
    浏览(55)
  • Unity【角色/摄像机移动控制】【3.摄像机跟随角色】

    本章代码基于前两章。 1. 我们新建CameraController脚本,将其挂载到Camera上 2. 在角色Player下新建一个空物体,命名为cameraTargetPoint,并将该物体挂载至CameraController脚本中【注意代码中的这行:public Transform cameraTargetPoint;】,将该空物体放在人物头部附近位置 3.将PlayerController脚本

    2024年02月22日
    浏览(52)
  • vue对接海康摄像头,使用hk3.3(硬盘录像机)开发摄像头分屏翻页操作。

    默认展示4*4规格,分屏之后自己写翻页方法,对摄像头一一展示(1x1, 2x2, 3x3, 4x4),有俩个场景。 1、刚开始默认展示的时候进行分页。 2、点击分屏操作之后进行分页。 思路: 1、拿到所有的通道号,比如有[1, 2, 3…, 100]; 2、 点击分屏之后就会把这个数组变为 1*1[[1], [

    2024年02月13日
    浏览(72)
  • Unity丨移动相机朝向目标并确定目标在摄像机可视范围内丨摄像机注释模型丨摄像机移动丨不同尺寸模型优化丨

    本文提供的功能是摄像机朝向目标移动,并确定整个目标出现在摄像机视角内,针对不同尺寸的模型优化。 提示:这里可以添加技术名词解释 直接上代码 后期可扩展功能:类似点击目标完成视角移动等。

    2024年02月07日
    浏览(58)
  • 小米摄像机升级失败,小米摄像机黄灯常亮修复,全网最硬核修复

    2020年买了个小米云台相机pro,后来搬家没怎么用,放家里吃灰一年多,前两天突然翻到想着拿来用一用,结果开机后提示要升级,我就点了升级,结果升级好重启后就一直没反应了,一直黄灯常亮。升级期间也没断电干啥的,结果就不能开机了。然后网上找方法说可以下载固

    2024年02月10日
    浏览(163)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包