# opencv_face_demo **Repository Path**: MIKECODE/opencv_face_demo ## Basic Information - **Project Name**: opencv_face_demo - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2025-03-15 - **Last Updated**: 2025-09-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # opencvface应用 ## 介绍 opencvface应用是一个基于opencv的人脸检测,人脸对比应用(待实现),参考[opencv_app_sample](https://gitcode.com/openharmony-sig/third_party_opencv/tree/master/samples/ohos_samples/opencv_app_sample)应用实现,后续会基于`FaceDetectorYN`和`FaceRecognizerSF`是实现人脸比对。 ## 效果预览 视频地址:待更新 | 首页 | 切换图片 | 识别中 | 识别完成 | | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | | ![image](assets/image-20250315174035-glk1ajv.png) | ![image](assets/image-20250315174235-ey4dfpt.png) | ![image](assets/image-20250315174218-4w8py6a.png) | ![image](assets/image-20250315174027-px3gut4.png) | 使用说明 1. 首先打开应用,点击FaceDetect开始人脸识别。 2. 识别完成后点击Recover开始滑动文件名进行图片切换 ## 具体实现 1. 应用启动与初始化 * **主线程操作**:用户启动应用后,主线程调用 `Index` 组件的 `aboutToAppear` 方法。在此方法中,首先初始化 `imageName` 和 `rawfileArray`,其中 `imageName` 初始化为 `1.jpeg`,`rawfileArray` 通过 `getContext().resourceManager.getRawFileListSync('')` 获取资源文件列表。同时,创建一个工作线程实例 `workerInstance`,它将用于后续的图片处理任务。另外,为 `workerInstance` 的 `onmessage` 事件注册回调函数,此回调函数用于接收工作线程处理后的结果。 * **资源准备**:主线程还会对界面进行初始化,设置好界面元素的初始状态,等待用户进行操作。 2. 从图片进行人脸检测 * **用户操作与主线程响应**:用户点击 “FaceDetect” 按钮,这会触发主线程的操作。主线程首先更新界面状态为 “正在处理...”,清空之前处理后的图像数据 `imagePixelMap`,然后将包含文件名和上下文信息的消息发送给工作线程。同时,更新界面状态为处理中,等待工作线程返回处理结果。 * **工作线程处理**:工作线程接收到主线程发送的消息后,获取文件路径和文件名,调用 OpenCV 原生代码中的 `faceDetect` 方法进行人脸检测。具体步骤包括: 从资源文件中读取图像数据并转换为 OpenCV 的 `Mat` 对象; 加载人脸检测模型;将图像转换为灰度图像; 使用 `faceCascade.detectMultiScale` 方法检测人脸; 若检测到人脸,使用 `rectangle` 函数在图像上框出人脸位置; 最后将处理后的图像转换为 `PixelMap` 格式,并封装成 `PixelInfo` 对象返回给工作线程。 * **结果返回与界面更新**:工作线程接收到 OpenCV 返回的 `PixelInfo` 对象后,尝试创建 `PixelMap`。若创建成功,将处理后的 `PixelMap` 发送给主线程;若创建失败,则记录错误日志。主线程接收到处理后的 `PixelMap` 后,更新界面显示处理后的图像,并将状态更新为 “处理完成”。 3. 恢复界面初始状态 * **用户操作与主线程响应**:用户点击 “Recover” 按钮,主线程会将界面恢复到初始状态。具体操作包括将 `isGray` 状态重置为 `false`,将界面状态信息更新为 “未开始”,从而让界面回到可重新选择图片进行人脸检测的状态。 ## 工程目录 ```cmd └───entry └───src └───main │───cpp │ └───image_basic │ faceDetect.cpp //人脸检测代码实现 ├───ets │ ├───entryability │ │ EntryAbility.ets //入口类 │ ├───pages │ │ Index.ets //首页 │ ├───utils │ │ Logger.ts //日志工具类 │ └───workers │ dealPictureWorker.ets //Worker线程操作 └───resources ├───base ├───en_US │───zh_CN └───rawfile n.jpg //图片资源 haarcascade_frontalface_alt.xml //Haar级联分类器 yunet_n_640_640.onnx //人脸检测神经网络(实现中) ``` ## 相关权限 无 ## 依赖 依赖opencv库 ## 约束与限制 1. 本示例仅支持标准系统上运行,支持OH4.1及以上版本; 2. 本示例为stage模型,已适配API version 11版本SDK,SDK版本号(API Version 11 Release),镜像版本号(4.1.9.2)。 3. 本示例需要使用DevEco Studio 版本号(4.1 Release)才可编译运行。 ## 下载 下载代码请复制以下命令到终端执行 ``` git clone https://gitee.com/MIKECODE/opencv_face_demo.git ```