【问题标题】:How to run many haarcascade xml files in the same Java program using OpenCV?如何使用 OpenCV 在同一个 Java 程序中运行多个 haarcascade xml 文件?
【发布时间】:2017-03-09 12:43:09
【问题描述】:

我是 OpenCV 的新手,我想运行一个 Java 程序来使用 OpenCV 进行人脸检测。

只包含一个 haarcascade xml 文件不会给我预期的结果。所以我需要在同一个程序中运行两三个 haarcascade 文件。 (特别是“haarcascade_frontalface_alt.xml”和“haarcascade_profileface.xml”一起)。

我尝试使用以下代码来执行此操作,但没有成功。请说明如何进行。

谢谢。

public class LiveFeed extends WatchDogBaseFrame {

private DaemonThread myThread = null;
int count = 0;
VideoCapture webSource = null;
Mat frame = new Mat();
MatOfByte mem = new MatOfByte();
CascadeClassifier faceDetector1 = new CascadeClassifier("/home/erandi/NetBeansProjects/WatchDog/src/ueg/watchdog/view/haarcascade_frontalface_alt.xml");
CascadeClassifier faceDetector2 = new CascadeClassifier("/home/erandi/NetBeansProjects/WatchDog/src/ueg/watchdog/view/haarcascade_eye.xml");
MatOfRect faceDetections = new MatOfRect();

public LiveFeed(WatchDogBaseFrame parentFrame) {
    super(parentFrame);
    initComponents();
    super.setCloseOperation();
    jButtonExit.setVisible(false);
}

//class of demon thread
public class DaemonThread implements Runnable {

    protected volatile boolean runnable = false;

    @Override
    public void run() {
        synchronized (this) {
            while (runnable) {
                if (webSource.grab()) {
                    try {
                        webSource.retrieve(frame);
                        Graphics graphics = jPanelVideo.getGraphics();
                        faceDetector1.detectMultiScale(frame, faceDetections);
                        faceDetector2.detectMultiScale(frame, faceDetections);
                        for (Rect rect : faceDetections.toArray()) {
                            // System.out.println("ttt");
                            Imgproc.rectangle(frame, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                                    new Scalar(0, 255, 0));
                        }
                        Imgcodecs.imencode(".bmp", frame, mem);
                        Image im = ImageIO.read(new ByteArrayInputStream(mem.toArray()));
                        BufferedImage buff = (BufferedImage) im;
                        if (graphics.drawImage(buff, 0, 0, getWidth(), getHeight() - 150, 0, 0, buff.getWidth(), buff.getHeight(), null)) {
                            if (runnable == false) {
                                System.out.println("Paused ..... ");
                                this.wait();
                            }
                        }
                    } catch (Exception ex) {
                        System.out.println("Error");
                    }
                }
            }
        }
    }
}

【问题讨论】:

  • faceDetector2.detectMultiScale(frame, faceDetections); 的第二次调用将覆盖存储在faceDetections 中的上一个类的结果。创建 2 个变量 faceDetections1faceDetections2 然后分别迭代它们,它们不会隐式连接结果

标签: java opencv haar-classifier


【解决方案1】:

Object Detection using Haar feature-based cascade classifiers是Paul Viola和Michael Jones在2001年的论文“Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一种有效的对象检测方法。它是一种基于机器学习的从大量正面和负面图像中训练级联函数的方法。然后用于检测其他图像中的对象。

OpenCV 已经包含许多针对面部、眼睛、微笑等进行预训练的分类器。这些 XML 文件存储在 opencv/data/haarcascades/ 文件夹中。

您不能同时运行多个级联文件并提高性能。但是您可以将它们一一用作循环,并通过该循环传递输入图像。

此链接中给出了示例代码:OpenCv sample code

【讨论】:

    猜你喜欢
    • 2017-11-08
    • 1970-01-01
    • 2011-09-02
    • 2018-03-12
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    相关资源
    最近更新 更多