如何使用 OpenCV 在同一个 Java 程序中 运行 多个 haarcascade xml 文件?
How to run many haarcascade xml files in the same Java program using OpenCV?
我是 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");
}
}
}
}
}
}
使用基于 Haar 特征的级联分类器进行目标检测是 Paul Viola 和 Michael Jones 在他们的论文 "Rapid Object Detection using a Boosted Cascade of Simple Features" 于 2001 年提出的一种有效的目标检测方法。它是一种基于机器学习的方法,其中级联函数是从大量正面和负面图像中训练出来的。然后用于检测其他图像中的对象。
OpenCV 已经包含许多预训练的面部、眼睛、微笑等分类器。这些 XML 文件存储在 opencv/data/haarcascades/ 文件夹中。
您不能同时 运行 多个级联文件并提高性能。但是您可以将它们一个一个地用作循环,并通过该循环传递输入图像。
此 link 中给出了示例代码:OpenCv sample code
我是 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");
}
}
}
}
}
}
使用基于 Haar 特征的级联分类器进行目标检测是 Paul Viola 和 Michael Jones 在他们的论文 "Rapid Object Detection using a Boosted Cascade of Simple Features" 于 2001 年提出的一种有效的目标检测方法。它是一种基于机器学习的方法,其中级联函数是从大量正面和负面图像中训练出来的。然后用于检测其他图像中的对象。
OpenCV 已经包含许多预训练的面部、眼睛、微笑等分类器。这些 XML 文件存储在 opencv/data/haarcascades/ 文件夹中。
您不能同时 运行 多个级联文件并提高性能。但是您可以将它们一个一个地用作循环,并通过该循环传递输入图像。
此 link 中给出了示例代码:OpenCv sample code