【问题标题】:OpenCV.js - detectMultiScale "This Exception cannot be caught"OpenCV.js - detectMultiScale“无法捕获此异常”
【发布时间】:2019-06-07 08:17:12
【问题描述】:

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

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

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

我从他们的 GitHub here 中获取了一个示例,并根据我的需要调整了代码,如下所示:

<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 和面部识别经验的人可以提供帮助吗?

【问题讨论】:

    标签: javascript html opencv


    【解决方案1】:

    解决办法是

    let faceCascadeFile = 'haarcascade_frontalface_default.xml'; 
    utils.createFileFromUrl(faceCascadeFile, faceCascadeFile, () => {
        console.log('cascade ready to load.');
        let src = cv.imread('imageInit');
        let gray = new cv.Mat();
        cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0);
        let faces = new cv.RectVector();
        let faceCascade = new cv.CascadeClassifier();
            faceCascade.load(faceCascadeFile); 
            let msize = new cv.Size(0, 0);
            faceCascade.detectMultiScale(gray, faces, 1.1, 3, 0, msize, msize); 
        }); 
    }
    

    完整代码和解释请使用此链接Face Detection with Javascript and OpenCV

    Human Eye Detection using Javascript and OpenCV

    【讨论】:

      【解决方案2】:

      关注这个thread:

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

      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 
      });
      

      人脸检测其他示例

      TRY IT :

      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 参数,如下例所示:

      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);
      

      【讨论】:

        猜你喜欢
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 2021-09-17
        • 2021-10-03
        • 2018-02-04
        • 2018-02-04
        相关资源
        最近更新 更多