龚谋 2024-10-11 17:10 采纳率: 0%
浏览 19
已结题

安卓OpenCV人脸识别分类器加载


 public boolean detectFaces(Bitmap image) {
        Mat mat = new Mat();
        Utils.bitmapToMat(image, mat);

        InputStream inputStream = getResources().openRawResource(R.raw.haarcascade_frontalface_default);
        CascadeClassifier faceDetector = new CascadeClassifier();

        String cascadeFilePath = getCacheDir() + "/haarcascade_frontalface_default.xml";
        try (FileOutputStream fos = new FileOutputStream(cascadeFilePath)) {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            Log.e("GONG6", "Error loading cascade file", e);
            return false;
        }

        // 检查文件是否存在
        File cascadeFile = new File(cascadeFilePath);
        if (!cascadeFile.exists()) {
            Log.e("GONG6", "Cascade file does not exist: " + cascadeFilePath);
            return false;
        }

        // 加载分类器
        if (!faceDetector.load(cascadeFilePath)) {
            Log.e("GONG6", "分类器加载成功");
            return false;
        } else {
            Log.i("GONG6", "分类器加载失败");
        }

        MatOfRect faces = new MatOfRect();
        faceDetector.detectMultiScale(mat, faces);

        if (faces.toArray().length > 0) {
            Log.i("GONG6", "检测到人脸");
            return true;
        }

        Log.i("GONG6", "未检测到人脸");
        return false;
    }

能看看这分类器加载失败吗

  • 写回答

19条回答

  • 香格里辣 2024-10-11 17:11
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的代码片段,分类器加载失败的处理逻辑存在一些问题。当尝试加载分类器并出现失败情况时,您的代码中的日志输出是“分类器加载成功”,但实际上应该输出的是“分类器加载失败”。这会导致混淆和误解。以下是修正后的代码片段:

    public boolean detectFaces(Bitmap image) {
        Mat mat = new Mat();
        Utils.bitmapToMat(image, mat);
    
        InputStream inputStream = getResources().openRawResource(R.raw.haarcascade_frontalface_default);
        CascadeClassifier faceDetector = new CascadeClassifier();
    
        String cascadeFilePath = getCacheDir() + "/haarcascade_frontalface_default.xml";
        try (FileOutputStream fos = new FileOutputStream(cascadeFilePath)) {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            Log.e("GONG6", "Error loading cascade file", e);
            return false;
        }
    
        // 检查文件是否存在
        File cascadeFile = new File(cascadeFilePath);
        if (!cascadeFile.exists()) {
            Log.e("GONG6", "Cascade file does not exist: " + cascadeFilePath);
            return false;
        }
    
        // 加载分类器
        if (!faceDetector.load(cascadeFilePath)) {
            Log.e("GONG6", "分类器加载失败"); // 修改此处日志输出为“分类器加载失败”
            return false; // 当分类器加载失败时,应返回false表示失败情况
        } else {
            Log.i("GONG6", "分类器加载成功"); // 当分类器加载成功时,输出相应的日志信息
        }
    
        MatOfRect faces = new MatOfRect();
        faceDetector.detectMultiScale(mat, faces);
    
        if (faces.toArray().length > 0) {
            Log.i("GONG6", "检测到人脸");
            return true; // 当检测到人脸时,返回true表示成功检测到人脸
        } else { // 当未检测到人脸时,也应输出相应的日志信息,并返回相应的结果
            Log.i("GONG6", "未检测到人脸");
            return false; // 未检测到人脸时,返回false表示未检测到人脸的情况
        }
    }
    

    请注意,上述代码中的修改仅涉及日志输出的修正。如果在实际应用中仍然遇到分类器加载失败的问题,请确保您正确地将Haar级联分类器的XML文件放置在正确的路径下,并且确保您的应用程序具有读取该文件的权限。此外,还要确保您使用的OpenCV库版本与您的项目兼容。

    评论

报告相同问题?

问题事件

  • 系统已结题 10月20日
  • 赞助了问题酬金15元 10月12日
  • 创建了问题 10月11日

悬赏问题

  • ¥15 Qt音乐播放器的音乐文件相对路径怎么写
  • ¥15 VB.NET利用摄像头拍照的程序
  • ¥15 用Qt实现TCP通信测试不知道为什么没连上
  • ¥15 linux下vscode设置不了字连体
  • ¥20 游戏mod是如何制作的
  • ¥15 关于#hadoop#的问题:按照老师上课讲的步骤写的
  • ¥20 有人会用这个工具箱吗 付fei咨询
  • ¥30 成都市武侯区住宅小区兴趣点
  • ¥15 Windows软实时
  • ¥15 自有服务器搭建网络隧道并且负载均衡