C++ opencv设置视频的捕获方式为 MJPG设置失败

2023-10-06 01:36

本文主要是介绍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设置失败的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/152517

相关文章

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件