You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI集成OpenCV人脸识别遇文件未找到错误求助

解决MAUI中OpenCV加载人脸检测XML文件的"文件未找到"问题

核心问题在于MAUI的资源文件无法直接通过相对路径被OpenCV的CascadeClassifier读取,且该类不支持异步加载。解决思路是先把嵌入式资源文件复制到应用本地可读写的同步路径,再用该路径初始化检测器。

步骤1:配置资源文件属性

右键你的haarcascade_frontalface_default.xml文件(建议放在Resources/Raw目录下),修改属性:

  • 生成操作:设置为嵌入式资源
  • 复制到输出目录:设置为较新则复制

也可以直接编辑项目的.csproj文件,添加以下配置:

<ItemGroup>
  <EmbeddedResource Include="Resources\Raw\haarcascade_frontalface_default.xml">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </EmbeddedResource>
</ItemGroup>

步骤2:修改代码实现异步复制+同步加载

把检测器初始化逻辑移到页面生命周期的异步方法中,先复制资源到本地路径,再同步加载:

using Emgu.CV;
using Emgu.CV.Structure;
using Microsoft.Maui.Graphics;
using System.IO;
using System.Reflection;

namespace RapsysApp
{
    public partial class MainPage : ContentPage
    {
        private VideoCapture _capture;
        private CascadeClassifier _faceDetector;

        public MainPage()
        {
            InitializeComponent();
        }

        protected override async void OnAppearing()
        {
            base.OnAppearing();
            
            // 将嵌入式资源复制到本地可访问路径
            var localXmlPath = await CopyResourceToLocal("haarcascade_frontalface_default.xml");
            
            // 用本地路径初始化人脸检测器
            _faceDetector = new CascadeClassifier(localXmlPath);
            
            // 启动相机预览
            StartCameraPreview();
        }

        private async Task<string> CopyResourceToLocal(string resourceFileName)
        {
            // 资源的完整命名空间路径(根据你的项目结构调整)
            var resourceFullPath = $"RapsysApp.Resources.Raw.{resourceFileName}";
            var localSavePath = Path.Combine(FileSystem.AppDataDirectory, resourceFileName);

            // 本地文件已存在则直接返回路径
            if (File.Exists(localSavePath))
                return localSavePath;

            // 读取嵌入式资源并写入本地
            using var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceFullPath);
            using var localFileStream = new FileStream(localSavePath, FileMode.Create, FileAccess.Write);
            
            await resourceStream.CopyToAsync(localFileStream);
            
            return localSavePath;
        }

        // 你的相机预览启动方法
        private void StartCameraPreview()
        {
            // ...原有逻辑
        }
    }
}

关键说明

  1. 资源路径正确性:resourceFullPath要和你的项目命名空间、文件目录严格对应,比如文件在Resources/Raw下,项目命名空间是RapsysApp,则路径为RapsysApp.Resources.Raw.文件名。
  2. 本地存储目录:FileSystem.AppDataDirectory是MAUI提供的应用专属可读写目录,所有平台都支持,避免权限问题。
  3. 生命周期适配:不在构造函数中做异步操作,改用OnAppearing生命周期方法,既满足异步需求,又不影响页面初始化。

内容的提问来源于stack exchange,提问作者Kathir M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:50:02