解决OpenCV捕捉USB摄像头时抓帧失败的问题

这篇具有很好参考价值的文章主要介绍了解决OpenCV捕捉USB摄像头时抓帧失败的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

笔记本上外接了一个USB相机,用OpenCV打开摄像头捕捉图像结果报错如下:

[ WARN:1] videoio(MSMF): OnReadSample() is called with error status: -2147024809
[ WARN:1] videoio(MSMF): async ReadSample() call is failed with error status: -2147024809
[ WARN:0] videoio(MSMF): can't grab frame. Error: -2147024809

最开始的代码:


#include <iostream>

#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main() {
	VideoCapture cap(0); 
	if (!cap.isOpened()) {
		return -1;
	}
	namedWindow("frame", WINDOW_AUTOSIZE);
	for (;;) {
		Mat frameIn;
		cap >> frameIn;
		imshow("frame", frameIn);
		if (waitKey(30) >= 0) break;
	}
	return 0;
}

videoio(MSMF): can’t grab frame. Error: -2147024809这个报错显示为抓帧失败,以前从来没遇到过这个问题,程序是最简化的程序了肯定不会有问题,一度怀疑是相机不能用。
其实这个问题只与USB相机的ID号有关,可以通过下面两种方式获取ID号:
1.参考网上的方法进行暴力破解cv2.VideoCapture(0)获取USB摄像头失败解决方案,等待的时间稍微有点长,一般而言最后出来的ID都是700(待会在第二种方法下面解释原因),将VideoCapture cap(id)中的id改为700即可正常显示:


#include <iostream>

#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main() {
	int id = 3;
	while (true)
	{
		VideoCapture cap(id);  //ID:700
		if (!cap.isOpened())
			id += 1;
		else break;
	}
	cout << "id:" << id << endl;
	VideoCapture cap(id);  //ID:700
	if (!cap.isOpened()) {
		return -1;
	}
	namedWindow("frame", WINDOW_AUTOSIZE);
	for (;;) {
		Mat frameIn;
		cap >> frameIn;
		imshow("frame", frameIn);
		if (waitKey(30) >= 0) break;
	}
	return 0;
}

2.一般来说电脑能够外接数量也是有限的,电脑相机的ID无非是0、1、2,所以外接设备的ID号也应该是其中之一,如果有多个摄像头无法确定其对应的ID,可以参照C++跟C#获取电脑上连接的多个摄像头名称与编号来获取每个相机的名称和对应的ID。
我的输出结果如下图所示,说明我的外接设备的ID是0,问题是我最开始的ID就是VideoCapture cap(0); 按理说没问题才对啊?这就涉及到另一个问题:DShowopencv打开摄像头与DShow相关
解决OpenCV捕捉USB摄像头时抓帧失败的问题
所以此时我将VideoCapture cap(0); 改为:VideoCapture cap(0,CAP_DSHOW);
原始程序变为:


#include <iostream>

#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main() {
	VideoCapture cap(0,CAP_DSHOW);  //ID:700
	if (!cap.isOpened()) {
		return -1;
	}
	namedWindow("frame", WINDOW_AUTOSIZE);
	for (;;) {
		Mat frameIn;
		cap >> frameIn;
		imshow("frame", frameIn);
		if (waitKey(30) >= 0) break;
	}
	return 0;
}

所以归根结底还是摄像头需要进一步指定DShow(DirectShow)来打开,其对应的ID值就是700.文章来源地址https://www.toymoban.com/news/detail-440734.html

到了这里,关于解决OpenCV捕捉USB摄像头时抓帧失败的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python OpenCV读取并显示USB UVC摄像头

    1. 安装Python, 略。 2. 安装 OpenCV:         3. 预览摄像头画面脚本:

    2024年02月13日
    浏览(47)
  • Jetson Orin Nano 使用OpenCV调用USB摄像头

    Jetson Orin Nano 8G ubuntu 20.04 检查usb摄像头是否被识别到 或者 Jetson Orin Nano 使用OpenCV调用USB摄像头

    2024年01月21日
    浏览(66)
  • RK3588安装Qt+opencv+采集USB摄像头画面

    Qt:5.12.8 opencv:3.4.14 qt安装 ---------------------------------------------------------------------------------- 因为使用官网下载的版本始终安装失败,所以我可以直接使用命令行进行下载安装: 1:首先先将ubuntu的软件更新,并更新镜像源 sudo apt-get update sudo apt-get upgrade 2:使用如下步骤安装Qt

    2023年04月10日
    浏览(53)
  • jetson nano 用opencv使用摄像头(CSI和USB)

    目录 1.测试摄像头是否可用 查看是否连接到摄像头  CSI摄像头测试 USB摄像头测试 2.若以上步骤正常,进行oepncv读取摄像头数据 (1)CSI摄像头 1.安装v4l2-utils协助工具 2.查看摄像头详细参数--支持的图片大小和对应帧率 3.安装管道gstreamer库 4.使用opencv读取图片例程 (2)USB摄像

    2024年02月08日
    浏览(39)
  • 在全志H616核桃派上实现USB摄像头的OpenCV颜色检测

    在给核桃派开发板用OpenCV读取图像并显示到pyqt5的窗口上并加入颜色检测功能,尝试将图像中所有蓝色的东西都用一个框标记出来。 按照惯例,先要介绍一下opencv中常用的hsv像素格式。颜色还是那个颜色,只是描述颜色用的参数变了。h代表色调,s代表饱和度,v代表明度,比

    2024年01月23日
    浏览(41)
  • jetson nano USB摄像头使用openCv打开帧率低的问题

    最近玩jetson nano的时候发现openCv打开USB摄像头帧率只有5帧,但是windows下能跑30帧,在网络搜了一下原因发现是摄像头默认读取格式不对,需要改成MJPG格式帧率才能上去,于是使用CSDN上找的代码,但是都不能工作,折腾了好久没搞定,突然想到上 stacoverflow上看看,没想到真的

    2024年02月06日
    浏览(118)
  • ROS高效进阶第四章 -- 机器视觉处理之图像格式,usb_cam,摄像头标定,opencv和cv_bridge引入

    从本文开始,我们用四篇文章学习ROS机器视觉处理,本文先学习一些外围的知识,为后面的人脸识别,目标跟踪和yolov5目标检测做准备。 我的笔记本是Thinkpad T14 i7 + Nvidia MX450,系统是ubuntu20.04,ros是noetic。由于很多驱动与硬件强相关,请读者注意这点。 本文的参考资料有:

    2024年02月04日
    浏览(42)
  • 【树莓派】USB摄像头+python+opencv 六、报错:python Non-ASCII character '\xe5' in file

    插入usb摄像头,在命令行模式下输入        lsusb         如果看到列举出来的信息有camera的话就说明识别成功,可以使用。 1、拍照测试 安装 fswebcam 输入以下命令,开启摄像头 2、录像测试 安装 luvcview 输入以下命令,开启摄像头 如果发现安装的是python3的话就需要把pyth

    2024年02月05日
    浏览(47)
  • Android相机调用-CameraX【外接摄像头】【USB摄像头】

    Android相机调用有原生的Camera和Camera2,我觉得调用代码都太复杂了,CameraX调用代码简洁很多。 说明文档:https://developer.android.com/jetpack/androidx/releases/camera?hl=zh-cn 现有查到的调用资料都不够新,对于外接摄像头(USB摄像头)这类非前置也非后置摄像头的设备调用,都说是没有实

    2024年02月09日
    浏览(52)
  • python opencv 调用摄像头失败问题的解决 Windows

    省流: 内含 Python Opencv 双目相机拍照代码(手动 or 自动),可自取; 如果你的 cv2.VideoCapture() 函数卡住但不报错,打开 Windows “相机”应用可以正常看到摄像头画面,且能够正常用 cv2.imshow() 打开图像,请继续阅读。 这个学期选修了方璐老师的媒体与认知课程,期末的 Fin

    2024年02月05日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包