C++ opencv设置视频的捕获方式为 MJPG设置失败
我有一款4k摄像头,在设置分辨率为4k的时候总是出现帧率不够的情况,
使用命令查看
v4l2-ctl --device=/dev/video0 --list-formats-ext
发现
v4l2-ctl --device=/dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMTType: Video Capture[0]: 'MJPG' (Motion-JPEG, compressed)Size: Discrete 3840x2160Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 640x480Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 2592x1944Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 2688x1512Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 2048x1536Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 1920x1080Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 1600x1200Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 1280x960Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 1280x720Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 960x540Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 800x600Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 640x360Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 720x1280Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)[1]: 'YUYV' (YUYV 4:2:2)Size: Discrete 3840x2160Interval: Discrete 1.000s (1.000 fps)Size: Discrete 640x480Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 2592x1944Interval: Discrete 0.500s (2.000 fps)Size: Discrete 2688x1512Interval: Discrete 0.500s (2.000 fps)Size: Discrete 2048x1536Interval: Discrete 0.333s (3.000 fps)Size: Discrete 1920x1080Interval: Discrete 0.200s (5.000 fps)Size: Discrete 1600x1200Interval: Discrete 0.200s (5.000 fps)Size: Discrete 1280x960Interval: Discrete 0.133s (7.500 fps)Size: Discrete 1280x720Interval: Discrete 0.100s (10.000 fps)Size: Discrete 960x540Interval: Discrete 0.050s (20.000 fps)Size: Discrete 800x600Interval: Discrete 0.050s (20.000 fps)Size: Discrete 640x360Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.040s (25.000 fps)Interval: Discrete 0.050s (20.000 fps)Interval: Discrete 0.100s (10.000 fps)Size: Discrete 720x1280Interval: Discrete 0.200s (5.000 fps)
因此我们需要设置视频捕获格式为 MJPG
C++ opencv中设置视频捕获格式为 MJPG
报错如下:
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1186) setProperty OpenCV | GStreamer warning: GStreamer: unhandled property
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1036) getProperty OpenCV | GStreamer warning: unhandled property: 6
这些警告可能是由于使用 GStreamer 后端而不是 V4L2(Video4Linux2)后端引起的。在某些系统上,默认情况下,OpenCV 使用 GStreamer 进行视频捕获。
要在 C++ 中使用 V4L2 后端设置视频捕获格式为 MJPG,您可以尝试使用以下代码:
#include <opencv2/opencv.hpp>int main()
{// 打开视频捕获设备cv::VideoCapture cap(0, cv::CAP_V4L2);// 设置视频捕获格式为 MJPGcap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));// 检查是否成功设置格式int fourcc = cap.get(cv::CAP_PROP_FOURCC);if (fourcc == cv::VideoWriter::fourcc('M', 'J', 'P', 'G')){std::cout << "视频捕获格式已成功设置为 MJPG" << std::endl;}else{std::cout << "视频捕获格式设置失败" << std::endl;}// 释放视频捕获设备cap.release();return 0;
}
在上述代码中,我们通过将 cv::CAP_V4L2 作为第二个参数传递给 cv::VideoCapture 构造函数来明确使用 V4L2 后端。这样可以确保使用 V4L2 后端进行视频捕获,而不是默认的 GStreamer 后端。
请注意,V4L2 后端的可用性取决于您的系统和安装的 OpenCV 版本。如果您的系统不支持 V4L2 后端,您可能无法通过设置 FourCC 来更改视频捕获格式。
下面是一个设置(Video Capture) ioctl: VIDIOC_ENUM_FMT 类型: 为MJPG
并且设置帧率和分辨率并显示视频的代码
/*****************************************************
2023.8.5: test_opencv.cpp
******************************************************/
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <fstream>
using namespace cv;
using namespace std;int main()
{// 测试视频// VideoCapture cap;cv::VideoCapture cap(0, cv::CAP_V4L2);if (!cap.isOpened()){printf("camera 打开失败\n");}else{printf("camera 打开 ok\n");}// 设置视频捕获格式为 MJPGcap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));// 检查是否成功设置格式int fourcc = cap.get(cv::CAP_PROP_FOURCC);if (fourcc == cv::VideoWriter::fourcc('M', 'J', 'P', 'G')){std::cout << "视频捕获格式已成功设置为 MJPG" << std::endl;}else{std::cout << "视频捕获格式设置失败" << std::endl;}// 设置视频分辨率int width = 3840;int height = 2160;cap.set(cv::CAP_PROP_FRAME_WIDTH, width);cap.set(cv::CAP_PROP_FRAME_HEIGHT, height);// 设置视频帧率double frameRate = 30.0;cap.set(cv::CAP_PROP_FPS, frameRate);// 检查是否成功设置分辨率和帧率int setWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH);int setHeight = cap.get(cv::CAP_PROP_FRAME_HEIGHT);double setFrameRate = cap.get(cv::CAP_PROP_FPS);if (setWidth == width && setHeight == height && setFrameRate == frameRate){std::cout << "视频分辨率和帧率已成功设置" << std::endl;printf("width=%d\n", frameWidth);printf("height=%d\n", frameHeight);printf("width=%d\n", frameWidth);}else{std::cout << "视频分辨率和帧率设置失败" << std::endl;}Mat frame;while (true){cap >> frame;if (frame.data == NULL){printf("Image is empty\n");break;}namedWindow("111", 0); // 参数为零,则可以自由拖动imshow("111", frame);waitKey(1);}return 0;
}相关文章:
C++ opencv设置视频的捕获方式为 MJPG设置失败
我有一款4k摄像头,在设置分辨率为4k的时候总是出现帧率不够的情况, 使用命令查看 v4l2-ctl --device/dev/video0 --list-formats-ext发现 v4l2-ctl --device/dev/video0 --list-formats-ext ioctl: VIDIOC_ENUM_FMTType: Video Capture[0]: MJPG (Moti…...
计算机网络两位伟人
克劳德艾尔伍德香农 克劳德艾尔伍德香农(Claude Elwood Shannon)是一位美国数学家、电子工程师和计算机科学家,被誉为“信息论之父”。他于1916年生于密歇根州,于2001年去世。以下是一些关于他的详细介绍: 信息论的奠…...
机器学习 不均衡数据采样方法:imblearn 库的使用
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
MySQL系统与内建函数
在游戏开发、特别是像《三国志》这样的大型策略游戏中,数据分析是不可或缺的。从玩家行为到游戏内的战役结果,都需要通过高效的数据分析来优化游戏体验。MySQL的系统和内建函数为这样的分析提供了强大的工具。 本文将详细介绍MySQL中常用的系统与内建函数,并通过《三国志》…...
STM32CubeMX学习笔记-USB接口使用(CDC虚拟串口)
STM32CubeMX学习笔记-USB接口使用(CDC虚拟串口) 一、USB简介二、新建工程1. 打开 STM32CubeMX 软件,点击“新建工程”2. 选择 MCU 和封装3. 配置时钟4. 配置调试模式 三、USB3.1 参数配置3.3 配置时钟3.4 USB Device 四、生成代码五、查看端口…...
腾讯云 Cloud Studio 实战训练营结营活动获奖公示
点击链接了解详情 “腾讯云 Cloud Studio 实战训练营” 是由腾讯云联合 CSDN 推出的系列开发者技术实践活动,通过技术分享直播、动手实验项目、优秀代码评选、有奖征文活动等,让广大开发者沉浸式体验腾讯云开发者工具 Cloud Studio 的同时,实…...
使用晶体管做布尔逻辑和逻辑门
目录 二进制,三进制,五进制 true,false表示0,1 早期计算机采用进制 布尔逻辑 三个基本操作:NOT,AND,OR 基础“真值表” NOT 如何实现? AND如何实现? OR如何实现? 图标表示…...
Linux系统编程系列之线程的信号处理
一、为什么要有线程的信号处理 由于多线程程序中线程的执行状态是并发的,因此当一个进程收到一个信号时,那么究竟由进程中的哪条线程响应这个信号就是不确定的,只能取决于哪条线程刚好在信号达到的瞬间被调度,这种不确定性在程序逻…...
【C语言】青蛙跳台阶 —— 详解
一、问题描述 跳台阶_牛客题霸_牛客网 (nowcoder.com) LCR 127. 跳跃训练 - 力扣(LeetCode) 二、解题思路 1、当 n 1 时,一共只有一级台阶,那么显然青蛙这时就只有一种跳法 2、当 n 2 时,一共有两级台阶ÿ…...
Java - 基本数据类型和封装类型
基本类型有默认值,而包装类型初始为null。然后再根据这两个特性进行分业务使用,在阿里巴巴的规范里所有的POJO类必须使用包装类型,而在本地变量推荐使用基本类型。 Java语言提供了八种基本类型。六种数字类型(四个整数型ÿ…...
day-63 代码随想录算法训练营(19) 图论 part 02
1020.飞地的数量 分析:求不跟边界接壤的陆地的数量 思路一:深度优先遍历 先从四个侧边找陆地,然后进行深度优先遍历,把所有接壤的陆地(1)全部转换成海洋(0) 深度优先遍历…...
SpringBoot的全局异常拦截
在 Spring Boot 中,可以通过使用 ControllerAdvice 注解和 ExceptionHandler 注解来实现全局异常拦截。 RestControllerAdvice RestControllerAdvice 是 Spring Framework 提供的注解,用于定义全局异常处理类,并且结合 ExceptionHandler 注…...
『力扣每日一题11』:转换成小写字母
一、题目 给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 示例 1: 输入:s "Hello" 输出:"hello"示例 2: 输入:s "here" 输…...
复习Day07:链表part03:21. 合并两个有序链表、2. 两数相加
之前的blog链接:https://blog.csdn.net/weixin_43303286/article/details/131700482?spm1001.2014.3001.5501 我用的方法是在leetcode再过一遍例题,明显会的就复制粘贴,之前没写出来就重写,然后从拓展题目中找题目来写。辅以Lab…...
Ubuntu中启动HDFS后没有NameNode解决办法
关闭进程: stop-dfs.sh 格式化: hadoop namenode -format 出现报错信息: 23/10/03 22:27:04 WARN fs.FileUtil: Failed to delete file or dir [/usr/data/hadoop/tmp/dfs/name/current/fsimage_0000000000000000000.md5]: it still exi…...
AWS-Lambda之导入自定义包-pip包
参考文档: https://repost.aws/zh-Hans/knowledge-center/lambda-import-module-error-python https://blog.csdn.net/fxtxz2/article/details/112035627 简单来说,以 " alibabacloud_dyvmsapi20170525 " 包为例 ## 创建临时目录 mkdir /tmp cd ./tmp …...
MAC 如何解决GitHub下载速度慢的问题
说在前面 解决github下载速度慢的方法很多,本文主要介绍通过Git镜像的方式解决下载慢的问题。 主要步骤有:1、找到gitconfig文件, 2、通过git命令查看当前生效的config 配置 3、使用git config命令编辑并添加国内镜像源 1、gitconfig 文件在…...
Redis与分布式-哨兵模式
接上文 Redis与分布式-主从复制 1.哨兵模式 启动一个哨兵,只需要修改配置文件即可, sentinel monitor lbwnb 1247.0.0.1 6001 1先将所有服务关闭,然后修改配置文件,redis Master,redis Slave,redis Slave…...
创建型设计模式 原型模式 建造者模式 创建者模式对比
创建型设计模式 单例 工厂模式 看这一篇就够了_软工菜鸡的博客-CSDN博客 4.3 原型模式 4.3.1 概述 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。 4.3.2 结构 原型模式包含如下角色: 抽象原型类:规定了…...
HTML详细基础(二)文件路径
目录 一.相对路径 二.绝对路径 三.超链接标签 四.锚点链接 首先,扩展一些HTML执行的原理: htmL(hypertext markup Language) 是一种规范(或者说是一种标准),它通过标记符(tag)来标记要显示…...
免费Mac工具QMCDecode:三步完成QQ音乐加密格式转换终极指南
免费Mac工具QMCDecode:三步完成QQ音乐加密格式转换终极指南 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,…...
老板扔来50个Excel表格怎么办?Gemini 3.1 Pro一键合并分析
在职场里,最让人头疼的任务之一,不是写方案,而是“收表”。尤其当老板一句“把这些数据汇总一下”,你打开附件一看,50个Excel表格躺在那里,命名还五花八门:有的带日期,有的带版本&am…...
LinkSwift网盘直链下载助手:9大平台高效免费下载完整指南
LinkSwift网盘直链下载助手:9大平台高效免费下载完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...
线性模型和线性混合效应模型变量选择——基于信息准则的随机搜索方法【附代码】
✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。 ✅ 如需沟通交流,扫描文章底部二维码。(1)基于变量重要度的嵌套模型最优子集随机搜索:对于…...
EasyMarkets易信:清算效率如何提升资金流转
EasyMarkets易信:清算效率如何提升资金流转摘要: 高效的清算过程是金融系统中的核心支柱,它通过优化资金的处理方式,显著加速资金的流动与可用性。在EasyMarkets易信的平台中,清算效率的提升不仅缩短了结算周期&#x…...
从物理卡到eSIM:一文读懂ISO/IEC 7816协议栈,揭秘你的手机如何与‘数字身份证’对话
从物理卡到eSIM:解密ISO/IEC 7816协议栈与移动身份认证的进化之路 当你用手机拨打电话时,是否想过那个小小的SIM卡是如何完成身份验证的?从传统的塑料卡片到如今内置的eSIM芯片,这场持续了三十年的技术演进背后,隐藏着…...
COCO数据集不只是跑Demo:手把手教你用PyTorch加载自定义训练集(含数据增强技巧)
COCO数据集实战:从数据加载到模型训练的PyTorch全流程指南 在计算机视觉领域,COCO数据集早已超越了简单的Demo演示价值,成为衡量算法性能的黄金标准。但许多开发者在使用过程中,往往止步于基础的数据加载和可视化,未能…...
全栈AI小程序开发实战:Spring Boot集成ChatGPT与微信支付
1. 项目概述:一个全栈AI小程序的诞生 最近在做一个挺有意思的私活,客户想做一个集成了ChatGPT、语音识别和图像生成的微信小程序。核心需求很明确:用户能在小程序里像跟真人聊天一样和AI对话,能语音输入,还能让AI根据文…...
川虎Chat:一站式LLM管理平台,集成文件问答与联网搜索
1. 项目概述:一个为大型语言模型打造的“万能驾驶舱” 如果你和我一样,在过去一年里深度体验过各种大语言模型(LLM),从ChatGPT到Claude,从本地部署的ChatGLM到在线调用的Gemini,那你一定也经历…...
大语言模型可控性挑战与工程实践
1. 大语言模型的可控性困境大语言模型(LLM)在自然语言处理领域展现出惊人的能力,但其"黑箱"特性带来的可控性问题日益凸显。去年我在部署一个客服对话系统时,模型突然开始用莎士比亚风格回答用户关于物流的查询——这种…...
