### 照相机案例说明文档 #### 介绍 本项目基于openharmony成功实现了按键操作照相机,照相机拍照,录像,预览等功能 参考文档 https://gitee.com/openharmony/multimedia_camera_standard https://gitee.com/42690727/my-open-harmony-sample/tree/master/%E6%A0%87%E5%87%86%E8%AE%BE%E5%A4%87/3.1%20Beta/%E6%8B%8D%E7%85%A7 https://blog.csdn.net/scy518/article/details/12022092 #### 环境搭建 参考官方文档搭建OpenHarmony Beta3.1版本代码标准系统开发环境 https://www.bookstack.cn/read/openharmony-1.0-zh-cn/quick-start-%E6%90%AD%E5%BB%BA%E7%8E%AF%E5%A2%83.md 如果测试demo03下载OpenHarmony 3.0 LTS 版本 \#repo init -u git@gitee.com:openharmony/manifest.git -b OpenHarmony-3.0-LTS --no-repo-verify 如果测试demo01或demo02使用Beta3.1版本代码 \#repo init -u git@gitee.com:openharmony/manifest.git -b refs/tags/OpenHarmony-v3.1-Beta --no-repo-verify \#repo sync -c \#repo forall -c 'git lfs pull' #### 示例实操 Demo01 按键操作系统照相机,此处内容参考于 Camera组件讲解 https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/driver-peripherals-camera-des.md https://gitee.com/openharmony/multimedia_camera_standard linux文件操作GPIO https://blog.csdn.net/scy518/article/details/12022092 将本仓库key_camera文件夹下源码下载并替换到/drivers/peripheral/camera/hal/init路径下相同名称代码,标准系统编译烧录,启动系统后进入bin目录,运行ohos_camera_demo应用,在按下按键后输入q,即可看到成功拍照,同时自动退出应用,也可根据提示测试不同功能案例 ![$M0F6%6YR4@P8~%~8PAC1CT](C:/Users/25166/Desktop/demo_camera_test/$M0F6%256YR4@P8~%25~8PAC1CT.png) Demo02 按键操作简单照相机,此处内容参考于 Camera组件讲解 https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/driver-peripherals-camera-des.md https://gitee.com/openharmony/multimedia_camera_standard 开源代码 https://gitee.com/42690727/my-open-harmony-sample/tree/master/%E6%A0%87%E5%87%86%E8%AE%BE%E5%A4%87/3.1%20Beta/%E6%8B%8D%E7%85%A7 https://blog.csdn.net/scy518/article/details/12022092 将本仓库ai_camera文件夹源码下载到 src/applications/standard/app 路径下,app是新建文件夹 在applications\standard\hap\ohos.build文件路径下 module_list里增加 "//applications/standard/app:ai_camera" 执行编译命令 ./build.sh --product-name Hi3516DV300 --ccache 烧录后进入bin目录,运行编译文件 cd bin ./ai_camera 按下按键即可拍照 bin目录中的ai_camera应用 ![img](https://img-blog.csdnimg.cn/997871024d514b84a6154a869a12e894.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6KGM6KGMeGg=,size_12,color_FFFFFF,t_70,g_se,x_16) 按键照相运行截图 ![watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6KGM6KGMeGg=,size_20,color_FFFFFF,t_70,g_se,x_16](C:/Users/25166/Desktop/demo_camera_test/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6KGM6KGMeGg=,size_20,color_FFFFFF,t_70,g_se,x_16.png) 进入/data/capture目录下可查看拍照存储的文件 Demo03 camera_sample使用 参考应用开发实例 https://docs.openharmony.cn/pages/000600020002/ https://gitee.com/openharmony/multimedia_camera_standard 此处内容基于OpenHarmony3.0LTS版本源代码 使用方法 说明:开发板启动后默认会加载launcher应用,应用的图形界面默认显示在媒体图层上方,会影响camera_sample的演示结果,因此需要在编译或是打包时去掉launcher应用。 **修改方法:**将“build/lite/components/applications.json”中camera_sample_app组件的targets中"//applications/sample/camera/launcher:launcher_hap"整行注释或删除。 修改源码路径“applications/sample/camera/media/BUILD.gn”中第一处的output_dir。 修改前:output_dir = "$root_out_dir/dev_ools" 修改后:output_dir = "$root_out_dir/" 重新执行源码仓编译并烧写入单板后,可在单板bin目录下找到camera_sample文件。 camera_sample是源代码中提供的一个相机实例,可以作为开发者的实例参考 启动后bin目录如图所示 ![img](https://img-blog.csdnimg.cn/c44cc25e658a48478f20a17143da7b04.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6KGM6KGMeGg=,size_20,color_FFFFFF,t_70,g_se,x_16)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) 启动camera_sample ![img](https://img-blog.csdnimg.cn/e023cb9588554cea85a55f8cc24065bc.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6KGM6KGMeGg=,size_20,color_FFFFFF,t_70,g_se,x_16)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) 说明 输入 1:启动拍照 2:启动摄像 3: 启动预览 q:退出 #### camera目录 仓目录结构如下: /foundation/multimedia/camera_standard # 相机组件业务代码 ├── frameworks # 框架代码 │ ├── native # 内部接口实现 │ │ ├── camera # 相机框架实现 │ │ └── metadata # 元数据实现 │ └── js # 外部接口实现 │ └── camera_napi # 相机NAPI实现 ├── interfaces # 接口代码 │ ├── inner_api # 内部接口 │ └── kits # 外部接口 ├── LICENSE # 许可证文件 ├── ohos.build # 构建文件 ├── sa_profile # 服务配置文件 └── services # 服务代码 ├── camera_service # 相机服务实现 └── etc # 相机服务配置 #### 原理说明 ##### 驱动GPIO 使用linux自带通用GPIO驱动 参考 [Linux通用GPIO驱动写法与应用_scy518的博客-CSDN博客](https://blog.csdn.net/scy518/article/details/120220926) GPIO口信息可以从原理图中获取: 可以看到两个自定义按钮的GPIO口分别是:GPIO0_1,GPIO0_2 ![输入图片说明](image.png) 从文档,了解到Hi3516DV300有控制器管理12组GPIO管脚,每组8个。 GPIO号 = GPIO组索引 (0~11) * 每组GPIO管脚数(8) + 组内偏移 举例:GPIO10_3的GPIO号 = 10 * 8 + 3 = 83 所以,按钮 GPIO0_1 = 0 * 8 + 1 = 1 GPIO0_2 = 0 * 8 + 2 = 2 GPIO配置: 函数声明 ![img](https://img-blog.csdnimg.cn/a6b286b40f6b4abab3168f22d469ef5b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6KGM6KGMeGg=,size_16,color_FFFFFF,t_70,g_se,x_16)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) 函数定义,例如 ![img](https://img-blog.csdnimg.cn/88d3518d9c4e4e0fa5fc3342fc7b9b37.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6KGM6KGMeGg=,size_20,color_FFFFFF,t_70,g_se,x_16)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) 完成后即可进行GPIO口的初始化,引脚输入输出定义 ![img](https://img-blog.csdnimg.cn/85694b5224d440bfbfa3f7ed585bad6f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6KGM6KGMeGg=,size_20,color_FFFFFF,t_70,g_se,x_16)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) ##### 驱动照相机 相机驱动的使用可以通过查看文档说明: https://gitee.com/openharmony/multimedia_camera_standard 1.创建缓冲区消费者端监听器(CaptureSurfaceListener)以保存图像。 2.获取相机管理器实例并获取相机对象列表。 3.使用相机对象创建相机输入来打开相机。 4.创建采集会话。 5.开始配置采集会话。 6.将相机输入添加到采集会话。 7.将相机输入添加到采集会话。 8.将相机输入添加到采集会话。 9.将拍照输出添加到采集会话。 10.将配置提交到采集会话。 11.拍摄照片。 12.释放采集会话资源。 13.释放采集会话资源。