OpenCV.js - detectMultiScale“无法捕获此异常" [英] OpenCV.js - detectMultiScale "This Exception cannot be caught"

查看:137
本文介绍了OpenCV.js - detectMultiScale“无法捕获此异常"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过 OpenCV.js 使用面部识别,但是当我调用 CascadeClassifier 对象的 detectMultiScale() 方法时,我收到错误:

I'm trying to use facial recognition via OpenCV.js, however when I call on the detectMultiScale() method of the CascadeClassifier object I receive the error:

未捕获 6446128 - 异常捕获已禁用,无法捕获此异常.使用 -s DISABLE_EXCEPTION_CATCHING=0 或 DISABLE_EXCEPTION_CATCHING=2 编译以捕获.

Uncaught 6446128 - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.

问题是我直接从 opencv.org - 它不是构建版本,因为我无法自己构建它,因此无法按照错误说明进行操作.

The problem is I'm leveraging a hosted version of opencv.js directly from opencv.org - it's not a build version because I'm unable to build it myself, and therefore cannot follow the error's instructions.

我参考了他们 GitHub 上的一个例子 在这里并根据我的需要调整了代码,如下所示:

I've followed an example from their GitHub here and adapted the code to suit my needs, as follows:

<html>
  <head>
    <script src="https://docs.opencv.org/master/opencv.js"></script>
    <script src="https://docs.opencv.org/master/utils.js"></script>
  </head>

  <body>
    <img id="test" src="image/with/face.jpg" alt=""/>

    <canvas id="output"></canvas>

    <script>
        let face_cascade = new cv.CascadeClassifier();
      face_cascade.load("https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades_cuda/haarcascade_frontalface_default.xml");

        function face_detector() {
                let imgEl = document.getElementById("test");
                let img = cv.imread(imgEl);

                cv.imshow("output", img);
                let src = cv.imread("output");

                let gray = new cv.Mat();
                let msize = new cv.Size(0,0);
                cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0);

                let faces = new cv.RectVector();
                face_cascade.detectMultiScale(gray, faces, 1.1, 3, 0, msize, msize); //Error occurs here
            }

        face_detector();
    </script>
  </body>
</html>

有使用 OpenCV.js 和面部识别经验的人可以提供帮助吗?

Anyone with experience with OpenCV.js and facial recognition that could help?

推荐答案

遵循这个 主题:

xml 文件是预先构建的";在使用 load 函数加载它们之前.为了实现这一点,它使用了 utils.js 中的 createFileFromUrl 函数.之后,我们终于可以从文件中加载我们的分类器了.

The xml files are "pre-built" before loading them with the load function. To achieve this it's used the function createFileFromUrl from utils.js. After that we can finally load our classifier from file.

let classifier = new cv.CascadeClassifier();  // initialize classifier

let utils = new Utils('errorMessage'); //use utils class

let faceCascadeFile = 'haarcascade_frontalface_default.xml'; // path to xml

// use createFileFromUrl to "pre-build" the xml
utils.createFileFromUrl(faceCascadeFile, faceCascadeFile, () => {
    classifier.load(faceCascadeFile); // in the callback, load the cascade from file 
});


人脸检测其他示例

试试看:

let src = cv.imread('canvasInput');
let gray = new cv.Mat();
cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0);
let faces = new cv.RectVector();
let eyes = new cv.RectVector();
let faceCascade = new cv.CascadeClassifier();
// load pre-trained classifiers
faceCascade.load('haarcascade_frontalface_default.xml');
// detect faces
let msize = new cv.Size(0, 0);

// try to change scaleFactor  and minNeighbors values
faceCascade.detectMultiScale(gray, faces,1.05,0);
for (let i = 0; i < faces.size(); ++i) {
    let roiGray = gray.roi(faces.get(i));
    let roiSrc = src.roi(faces.get(i));
    let point1 = new cv.Point(faces.get(i).x, faces.get(i).y);
    let point2 = new cv.Point(faces.get(i).x + faces.get(i).width,
                              faces.get(i).y + faces.get(i).height);
    cv.rectangle(src, point1, point2, [255, 0, 0, 255]);
    roiGray.delete(); roiSrc.delete();
}
cv.imshow('canvasOutput', src);
src.delete(); gray.delete(); faceCascade.delete();
faces.delete(); eyes.delete();

尝试更改 faceCascade.detectMultiScale 参数,如下面的示例所示:

Try to change faceCascade.detectMultiScale parameters like given examples below:

faceCascade.detectMultiScale(gray, faces,1.05,0);
faceCascade.detectMultiScale(gray, faces,1.05,1);

faceCascade.detectMultiScale(gray, faces,2,0);
faceCascade.detectMultiScale(gray, faces,2,1);

faceCascade.detectMultiScale(gray, faces,3,0);
faceCascade.detectMultiScale(gray, faces,3,1);

faceCascade.detectMultiScale(gray, faces,4,0);
faceCascade.detectMultiScale(gray, faces,4,1);

这篇关于OpenCV.js - detectMultiScale“无法捕获此异常"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆