当前位置: 首页 > news >正文

树莓派学习专题<8>:使用V4L2驱动获取摄像头数据--获取摄像头支持的分辨率

树莓派学习专题<8>:使用V4L2驱动获取摄像头数据--获取摄像头支持的分辨率

  • 1. 获取摄像头支持的分辨率
  • 2. 代码分析
  • 3. 树莓派实测

1. 获取摄像头支持的分辨率

使用如下代码获取摄像头支持的输出分辨率。

	struct v4l2_frmsizeenum stFrameSize ;/*********************************************** other codes * ********************************************/stFrameSize.index        = 0 ;stFrameSize.pixel_format = V4L2_PIX_FMT_YUYV ;printf("--Frame resolution descriptor ----------------------------\n") ;while(-1 != ioctl(g_iFDVideo, VIDIOC_ENUM_FRAMESIZES, &stFrameSize)){printf("-- %d. %c%c%c%c ", stFrameSize.index + 1, (stFrameSize.pixel_format >>  0) & 0xff, (stFrameSize.pixel_format >>  8) & 0xff, (stFrameSize.pixel_format >> 16) & 0xff, (stFrameSize.pixel_format >> 24) & 0xff) ;if(V4L2_FRMSIZE_TYPE_DISCRETE == stFrameSize.type){printf("type : DISCRETE\n\t\t width : %d\n\t\t height : %d\n", stFrameSize.discrete.width, stFrameSize.discrete.height) ;}else if(V4L2_FRMSIZE_TYPE_CONTINUOUS == stFrameSize.type){printf("type : CONTINUOUS\n") ;}else if(V4L2_FRMSIZE_TYPE_STEPWISE == stFrameSize.type){printf("type : STEPWISE\n""\t\t min_width   : %d\n""\t\t max_width   : %d\n""\t\t step_width  : %d\n""\t\t min_height  : %d\n""\t\t max_height  : %d\n""\t\t step_height : %d\n", stFrameSize.stepwise.min_width,stFrameSize.stepwise.max_width,stFrameSize.stepwise.step_width,stFrameSize.stepwise.min_height,stFrameSize.stepwise.max_height,stFrameSize.stepwise.step_height) ;}stFrameSize.index++ ;}printf("----------------------------------------------------------\n\n\n") ;

2. 代码分析

使用 VIDIOC_ENUM_FRAMESIZES 命令来获取摄像头支持的分辨率。该命令需要一个 struct v4l2_frmsizeenum 类型的参数。
该结构体的定义:

	struct v4l2_frmsizeenum {__u32			index;		/* Frame size number */__u32			pixel_format;	/* Pixel format */__u32			type;		/* Frame size type the device supports. */union {					/* Frame size */struct v4l2_frmsize_discrete	discrete;struct v4l2_frmsize_stepwise	stepwise;};__u32   reserved[2];			/* Reserved space for future use */};
  1. index 为序号,从0开始指定。
  2. pixel_format 像素格式。根据前述的 VIDIOC_ENUM_FMT 命令获取到的摄像头支持的格式填写。例如 **V4L2_PIX_FMT_YUYV ** 。
  3. type 为摄像头像素支持的分辨率类型。其可能有3个取值:
	enum v4l2_frmsizetypes {V4L2_FRMSIZE_TYPE_DISCRETE	= 1,V4L2_FRMSIZE_TYPE_CONTINUOUS	= 2,V4L2_FRMSIZE_TYPE_STEPWISE	= 3,};

如果是类型 V4L2_FRMSIZE_TYPE_DISCRETE,则结构体 v4l2_frmsizeenum 中,联合体取 discrete 。说明该摄像头支持特定值的分辨率(特定的宽、高)。
如果是类型 V4L2_FRMSIZE_TYPE_STEPWISE,则结构体 v4l2_frmsizeenum 中,联合体取 stepwise。说明该摄像头支持一系列步进的分辨率。
大多数CIS(CMOS image sensor)都支持 stepwise,即分辨率是可调的。因此如果接口是MIPI-CSI,估计大多数都是 stepwise 类型。如果是USB摄像头,摄像头内部带有主控,限制了分辨率,因此可能是 discrete 。此点纯属猜测。

  1. struct v4l2_frmsize_discrete 类型如下。此时摄像头支持特定宽高的分辨率。
	struct v4l2_frmsize_discrete {__u32			width;		/* Frame width [pixel] */__u32			height;		/* Frame height [pixel] */};
  1. struct v4l2_frmsize_stepwise 类型如下。此时摄像头支持一定步进的分辨率。
	struct v4l2_frmsize_stepwise {__u32			min_width;	/* Minimum frame width [pixel] */__u32			max_width;	/* Maximum frame width [pixel] */__u32			step_width;	/* Frame width step size [pixel] */__u32			min_height;	/* Minimum frame height [pixel] */__u32			max_height;	/* Maximum frame height [pixel] */__u32			step_height;	/* Frame height step size [pixel] */};

其中,:
min_width 为最小宽度,max_width 为最大宽度,step_width 为宽度步进值。
min_height 为最小高度,max_height 为最大高度,step_height 为高度步进值。

3. 树莓派实测

材料:

  1. Raspberry Pi 4B计算机;
  2. IMX219摄像头组件。
    运行上述代码,打印结果:
--Frame resolution descriptor ----------------------------
-- 1. YUYV type : STEPWISEmin_width   : 32max_width   : 3280step_width  : 2min_height  : 32max_height  : 2464step_height : 2
----------------------------------------------------------

可见,树莓派IMX219摄像头,当输出格式指定为YUYV时,输出宽度可在323280之间,以2为步进调节;输出高度可在322464之间,以2为步进调节。

需要注意的是,指定不同的pixel_format 时,可能获取到不同的分辨率支持。


http://www.xdnf.cn/news/82009.html

相关文章:

  • 【Nova UI】六、SASS 赋能组件库:通用方法与混入的变革力量
  • 安宝特分享|AR智能装备赋能企业效率跃升
  • 记录一次使用面向对象的C语言封装步进电机驱动
  • IDEA热加载
  • vue3 + element-plus中el-drawer抽屉滚动条回到顶部
  • drupal7可以从测试环境一键部署到生产环境吗
  • Spring Boot 启动生命周期详解
  • WebRTC服务器Coturn服务器用户管理和安全性
  • Sentinel源码—8.限流算法和设计模式总结二
  • 机器学习06-RNN
  • 时间模块 demo
  • Ubuntu24.04安装ROS2问题
  • 【阿里云大模型高级工程师ACP学习笔记】2.2 扩展答疑机器人的知识范围
  • 深度强化学习 pdf 董豪| 马尔科夫性质,马尔科夫过程,马尔科夫奖励过程,马尔科夫决策过程
  • React:<></>的存在是为了什么
  • 【FAQ】如何配置PCoIP零客户端AWI能访问
  • 网络开发基础(游戏)之 粘包分包
  • 【Web】TGCTF 2025 题解
  • 网络设备智能巡检系统-MCP案例总结
  • 【无人机】使用扩展卡尔曼滤波 (EKF) 算法来处理传感器测量,各传感器的参数设置,高度数据融合、不同传感器融合模式
  • 国产紫光同创FPGA实现SDI视频编解码+图像缩放,基于HSSTHP高速接口,提供2套工程源码和技术支持
  • 万字长文 | Apache SeaTunnel 分离集群模式部署 K8s 集群实践
  • notepad++技巧:查找和替换:扩展 or 正则表达式
  • 什么是 金字塔缩放(Multi-scale Input)
  • 符号速率估计——小波变换法
  • 【在阿里云或其他 CentOS/RHEL 系统上安装和配置 Dante SOCKS5 代理服务】
  • 【MCP Node.js SDK 全栈进阶指南】利用TypeScript-SDK打造高效MCP应用
  • 25.4.22学习总结
  • IOT项目——双轴追光系统
  • # 利用迁移学习优化食物分类模型:基于ResNet18的实践