weixin_43146727 2024-12-30 19:33 采纳率: 33.3%
浏览 10
已结题

javacv-人脸识别

调用javacv进行人脸识别时报错
相关代码

public static void test2() throws FFmpegFrameGrabber.Exception {
        String path = "D:\\OpenCV\\opencv-4.6.0\\data\\haarcascades\\haarcascade_frontalface_default.xml";
        CascadeClassifier classifier = new CascadeClassifier(path);

        String str = "D:\\test1.mp4";
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(str);
        CanvasFrame canvasFrame = new CanvasFrame("Video");
        grabber.start();
        OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();

        Frame frame;
        while ((frame = grabber.grab()) != null){
            Mat mat = converter.convert(frame);
            Mat gray = new Mat();
            // 转换为灰度图像
            opencv_imgproc.cvtColor(mat, gray, opencv_imgproc.COLOR_BGR2GRAY);
            //检测人脸
            RectVector rectVector = new RectVector();
            //报错位置
            classifier.detectMultiScale(gray,rectVector);
            for (Rect rect : rectVector.get()){
                opencv_imgproc.rectangle(mat, new Point(rect.x(), rect.y()),new Point(rect.x() + rect.width(), rect.y() + rect.height()), new Scalar(0,0, 0, 255));
            }
            canvasFrame.showImage(frame);
        }
        grabber.release();
    }

报错内容

java.lang.RuntimeException: OpenCV(4.5.3) D:\a\javacpp-presets\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.5.3\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'


添加jar包

<dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.6</version>
        </dependency>

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-12-30 19:35
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析: 报错内容显示在cascadedetect.cpp的1689行,错误信息为(-215:Assertion failed) !empty(),这是因为CascadeClassifier对象没有成功加载训练好的分类器文件导致的。 解决方案:
    1. 确保训练好的分类器文件路径正确,比如haarcascade_frontalface_default.xml文件的路径是否正确。
    2. 确保加载分类器文件成功,可以通过检查classifier.load(path)方法的返回值来确认加载是否成功。
    3. 确保jar包已经添加到项目依赖中,可以在pom.xml中添加javacv-platform的依赖。 示例代码:
    import org.bytedeco.opencv.opencv_objdetect.CascadeClassifier;
    import org.bytedeco.opencv.opencv_videoio.FFmpegFrameGrabber;
    import org.bytedeco.opencv.opencv_core.*;
    import org.bytedeco.javacv.CanvasFrame;
    import org.bytedeco.javacv.OpenCVFrameConverter;
    public static void test2() throws FFmpegFrameGrabber.Exception {
        String path = "D:\\OpenCV\\opencv-4.6.0\\data\\haarcascades\\haarcascade_frontalface_default.xml";
        CascadeClassifier classifier = new CascadeClassifier(path);
        String str = "D:\\test1.mp4";
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(str);
        CanvasFrame canvasFrame = new CanvasFrame("Video");
        grabber.start();
        OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
        Frame frame;
        while ((frame = grabber.grab()) != null){
            Mat mat = converter.convert(frame);
            Mat gray = new Mat();
            // 转换为灰度图像
            opencv_imgproc.cvtColor(mat, gray, opencv_imgproc.COLOR_BGR2GRAY);
            //检测人脸
            RectVector rectVector = new RectVector();
            //报错位置
            if(classifier.empty()){
                System.out.println("Classifier failed to load!");
                break;
            }
            classifier.detectMultiScale(gray, rectVector);
            for (Rect rect : rectVector.get()){
                opencv_imgproc.rectangle(mat, new Point(rect.x(), rect.y()),new Point(rect.x() + rect.width(), rect.y() + rect.height()), new Scalar(0,0, 0, 255));
            }
            canvasFrame.showImage(frame);
        }
        grabber.release();
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月7日
  • 已采纳回答 12月30日
  • 修改了问题 12月30日
  • 创建了问题 12月30日