新手入门『七』使用 EGE 25.11 新功能: 照相机接口

引言

EGE(Easy Graphics Engine)库是一个专为初学者设计的轻量级 C++ 图形库,它提供了简洁易用的 API 来进行图形编程。从 25.11 版本开始,EGE 新增了相机模块(ege::CameraCapture),使得开发者可以轻松地在程序中访问摄像头,进行实时图像采集和处理。

本文将详细介绍 camera_base.cpp 示例程序,这是一个功能完整的相机演示程序,展示了 EGE 相机模块的所有基础功能。通过本文,您将学习到如何使用 EGE 相机模块进行设备管理、实时预览、交互控制等操作。

一、EGE 相机类接口详解

1.1 相机模块概述

EGE 相机模块提供了一套完整的相机访问接口,主要包括以下功能:

  • 设备枚举:查找系统中所有可用的相机设备
  • 设备控制:打开/关闭相机、启动/停止采集
  • 参数设置:设置分辨率、帧率等参数
  • 帧数据获取:实时获取相机的图像帧
  • 分辨率查询:获取相机支持的所有分辨率列表

1.2 核心类和接口

1.2.1 CameraCapture 类

ege::CameraCapture 是相机模块的核心类,提供了以下主要方法:

1.2.2 CameraFrame 类

CameraFrame 封装了从相机获取的单帧图像数据:

1.2.3 辅助函数

1.3 使用流程

使用 EGE 相机模块的典型流程如下:

1.4 编译器要求

相机模块需要 C++11 或更高版本的编译器支持。对于 MSVC,建议使用 MSVC 2022 或更高版本

可以使用 hasCameraCaptureModule() 函数在运行时检查当前 EGE 版本是否支持相机功能。

二、camera_base 功能概述

2.1 主要功能

camera_base.cpp 是一个功能完整的相机演示程序,展示了 EGE 相机模块的所有基础功能:

  • 设备管理:自动检测所有可用相机设备,支持多设备切换
  • 实时预览:将相机画面实时显示在窗口中
  • 交互控制:通过键盘快捷键切换相机和分辨率
  • 窗口自适应:根据相机分辨率自动调整窗口大小
  • 跨平台文本:根据编译器自动选择中英文界面
  • 详细信息显示:实时显示当前设备、支持的分辨率列表等

2.2 交互操作

程序支持以下键盘操作:

按键 功能
空格键 切换到下一个相机设备
数字键 0-9 直接切换到指定编号的相机
↑ 上箭头 切换到上一个分辨率
↓ 下箭头 切换到下一个分辨率
ESC 退出程序

2.3 界面信息

程序在窗口左上角显示丰富的信息:

  • 可用相机设备列表:显示所有检测到的相机设备,当前设备高亮显示
  • 设备切换提示:提示如何切换相机设备
  • 支持的分辨率列表:显示当前相机支持的所有分辨率(最多显示 8 个),当前分辨率高亮显示
  • 分辨率切换提示:提示如何切换分辨率

三、核心代码实现

3.1 设备枚举与初始化

程序启动时首先枚举所有可用的相机设备:

技术要点
– 使用 findDeviceNames() 获取所有可用设备
– 将设备名称保存到 vector 中,方便后续显示和管理
– 如果没有找到设备,显示错误提示并退出

3.2 相机切换功能

switchCamera 函数封装了切换相机的完整逻辑:

技术要点
– 切换前先关闭当前相机,释放资源
– 设置目标分辨率和帧率(默认 1280×720, 30fps)
– 打开指定索引的相机设备
– 启动采集,返回操作是否成功

3.3 分辨率管理

程序支持动态切换相机分辨率,并能显示所有支持的分辨率:

技术要点
– 使用 getDeviceSupportedResolutions() 获取所有支持的分辨率
– 将分辨率信息保存到 vector 中,方便遍历和选择
– 通过 findCurrentResolutionIndex 定位当前使用的分辨率

3.4 窗口自适应调整

根据相机分辨率智能调整窗口大小,同时考虑屏幕尺寸限制:

技术要点
– 使用 SystemParametersInfo 获取屏幕可用区域
– 保持相机原始宽高比,避免画面变形
– 限制窗口大小在合理范围内(640-1920 长边)
– 确保窗口不超出屏幕边界
– 使用 INIT_RENDERMANUAL 标志避免闪屏

3.5 主循环与交互控制

主循环负责获取帧数据、显示图像和处理用户输入:

技术要点
– 使用 delay_fps(60) 限制帧率为 60fps
grabFrame(3000) 最多等待 3 秒获取一帧
– 使用 putimage 将相机图像拉伸填充整个窗口
– 通过 kbhit()getkey() 处理键盘输入
– 使用 flushkey() 清空键盘缓冲区

3.6 界面显示功能

程序在屏幕上显示丰富的信息,帮助用户了解当前状态:

技术要点
– 使用不同颜色区分不同信息(黄色标题、绿色高亮、白色普通、青色提示)
– 当前设备和分辨率用绿色高亮显示
– 分辨率列表最多显示 8 个,避免占用过多空间
– 只有多个设备时才显示设备切换提示

四、技术要点总结

4.1 资源管理

  1. 智能指针grabFrame 返回 std::shared_ptr<CameraFrame>,自动管理内存,无需手动释放
  2. 设备切换:切换相机前先关闭当前设备,避免资源冲突
  3. 错误处理:对所有可能失败的操作进行检查,及时给出错误提示

4.2 性能优化

  1. 帧率控制:使用 delay_fps(60) 限制帧率,避免 CPU 占用过高
  2. 手动渲染:使用 INIT_RENDERMANUAL 标志,避免自动刷新导致的闪屏
  3. 阻塞模式:使用 grabFrame(3000) 阻塞等待,避免空转浪费 CPU

4.3 用户体验

  1. 窗口自适应:根据相机分辨率自动调整窗口大小
  2. 信息丰富:实时显示设备列表、分辨率列表、操作提示
  3. 快捷操作:支持空格、数字键、箭头键快速切换
  4. 跨平台文本:根据编译器自动选择中英文界面

五、常见问题解答

Q1: 为什么我的程序检测不到相机设备?

A: 请检查以下几点:
– 确保相机已正确连接并被系统识别
– 检查相机驱动是否正常安装
– 确认相机没有被其他程序占用
– 使用 enableCameraModuleLog(2) 启用日志查看详细错误信息

Q2: 为什么程序画面会闪烁?

A: 必须使用 INIT_RENDERMANUAL 标志初始化窗口。这个标志告诉 EGE 不要自动刷新窗口,避免与相机的高帧率产生冲突。

Q3: 如何提高相机帧率?

A: 可以采取以下措施:
– 降低相机分辨率(如使用 640×480 而非 1920×1080)
– 减少图像处理逻辑
– 使用更高性能的相机
– 检查系统 USB 带宽是否充足

Q4: 可以同时打开多个相机吗?

A: 可以。创建多个 CameraCapture 对象,分别打开不同的设备即可。但需要注意系统 USB 带宽和 CPU 性能限制。

Q5: 如何保存相机图像到文件?

A: 使用 EGE 的 saveimage 函数:

六、总结

camera_base.cpp 是学习 EGE 相机模块的最佳起点。它展示了:

  • ✅ 如何枚举和管理相机设备
  • ✅ 如何打开和关闭相机
  • ✅ 如何实时获取和显示相机图像
  • ✅ 如何动态切换相机设备和分辨率
  • ✅ 如何根据相机参数自适应调整窗口
  • ✅ 如何提供友好的用户界面和交互

掌握这个示例后,您就可以开始开发自己的相机应用了。对于更高级的图像处理和特效,可以参考 camera_wave – 相机水波特效 示例。

参考资源

  • EGE 官方网站:http://xege.org
  • EGE GitHub 仓库:https://github.com/x-ege/xege
  • API 文档:参见 EGE 安装包或源码仓库的 man/api/ 目录
  • 更多示例:参见 EGE 安装包或源码仓库的 demo/ 目录

完整代码

 

文章分类 教程 标签: ,