gpt4 book ai didi

opencv - Java 中的 CascadeClassifier 找不到带有网络摄像头的人脸

转载 作者:太空宇宙 更新时间:2023-11-03 21:02:22 25 4
gpt4 key购买 nike

我正在尝试翻译 OpenCV CascadeClassifier tutorial从 C++ 到 Java。在 C++ 中工作良好。还有这个java tutorial工作正常。

但是翻译根本就没有检测到人脸。我没有收到明确的错误。我可以看到来自网络摄像头的视频输入处理(灰色/直方图...)和视频显示。级联加载不会出错。但是 CascadeClassifier 调用不会返回任何面孔...因此,您可能可以跳过所有代码,直接转到我的 CascadeClassifier 调用,直至 public Mat detect(Mat inputframe)。由于我是 Java 和 OpenCV 的新手,我粘贴了其余部分(我删除了我认为可能不重要的任何内容),以防万一,但并不意味着让您调试...

我也以许多不同的方式尝试过这个调用(和其他部分),但没有...没有想法...

谢谢!!

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.highgui.VideoCapture;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

class My_Panel extends JPanel{

private static final long serialVersionUID = 1L;
private BufferedImage image;
private CascadeClassifier face_cascade;

// Create a constructor method
public My_Panel(){
super();
String face_cascade_name = "/haarcascade_frontalface_alt.xml";
//String face_cascade_name = "/lbpcascade_frontalface.xml";
//-- 1. Load the cascades

String str;
str = getClass().getResource(face_cascade_name).getPath();
str = str.replace("/C:","C:");
face_cascade_name=str;

face_cascade=new CascadeClassifier(face_cascade_name);
if( !face_cascade.empty())
{
System.out.println("--(!)Error loading A\n");
return;
}
else
{
System.out.println("Face classifier loooaaaaaded up");
}
}

private BufferedImage getimage(){
return image;
}

public void setimage(BufferedImage newimage){
image=newimage;
return;
}

/**
* Converts/writes a Mat into a BufferedImage.
*
* @param matrix Mat of type CV_8UC3 or CV_8UC1
* @return BufferedImage of type TYPE_3BYTE_BGR or TYPE_BYTE_GRAY
*/
public BufferedImage matToBufferedImage(Mat matrix) {
int cols = matrix.cols();
int rows = matrix.rows();
int elemSize = (int)matrix.elemSize();
byte[] data = new byte[cols * rows * elemSize];
int type;

matrix.get(0, 0, data);

switch (matrix.channels()) {
case 1:
type = BufferedImage.TYPE_BYTE_GRAY;
break;

case 3:
type = BufferedImage.TYPE_3BYTE_BGR;

// bgr to rgb
byte b;
for(int i=0; i<data.length; i=i+3) {
b = data[i];
data[i] = data[i+2];
data[i+2] = b;
}
break;

default:
return null;
}

BufferedImage image2 = new BufferedImage(cols, rows, type);
image2.getRaster().setDataElements(0, 0, cols, rows, data);

return image2;
}

public void paintComponent(Graphics g){
BufferedImage temp=getimage();
g.drawImage(temp,10,10,temp.getWidth(),temp.getHeight(), this);
}

public Mat detect(Mat inputframe){
Mat mRgba=new Mat();
Mat mGrey=new Mat();
MatOfRect faces = new MatOfRect();
//MatOfRect eyes = new MatOfRect();

inputframe.copyTo(mRgba);
inputframe.copyTo(mGrey);
Imgproc.cvtColor( mRgba, mGrey, Imgproc.COLOR_BGR2GRAY);
Imgproc.equalizeHist( mGrey, mGrey );

face_cascade.detectMultiScale(mGrey, faces);
//face_cascade.detectMultiScale(mGrey, faces, 1.1, 2, 0|Objdetect.CASCADE_SCALE_IMAGE, new Size(30, 30), new Size(200,200) );
//face_cascade.detectMultiScale(mGrey, faces, 1.1, 2, 2//CV_HAAR_SCALE_IMAGE,
// ,new Size(30, 30), new Size(200,200) );

System.out.println(String.format("Detected %s faces", faces.toArray().length));

return mGrey;
}
}

public class window {
public static void main(String arg[]){
// Load the native library.
System.loadLibrary("opencv_java245");

String window_name = "Capture - Face detection";

JFrame frame = new JFrame(window_name);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,400);

My_Panel my_panel = new My_Panel();
frame.setContentPane(my_panel);
frame.setVisible(true);

//-- 2. Read the video stream
BufferedImage temp;
Mat webcam_image=new Mat();

VideoCapture capture =new VideoCapture(0);
if( capture.isOpened())
{
while( true )
{
capture.read(webcam_image);
if( !webcam_image.empty() )
{
frame.setSize(webcam_image.width()+40,webcam_image.height()+60);

//-- 3. Apply the classifier to the captured image
// At this point I was wondering where this should be done.
// I put it within the panel class, but maybe one could actually
// create a processor object...
webcam_image=my_panel.detect(webcam_image);

//-- 4. Display the image
temp=my_panel.matToBufferedImage(webcam_image);
my_panel.setimage(temp);
my_panel.repaint();
}
else
{
System.out.println(" --(!) No captured frame -- Break!");
break;
}
}
}
return;
}
}

PS.: 其他信息,以防万一:

  1. mGrey 是:Mat [ 480*640*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0x19d9af48, dataAddr=0x19dc3430 ]
  2. 人脸是:Mat [ 0*0*CV_8UC1, isCont=false, isSubmat=false, nativeObj=0x194bb048, dataAddr=0x0 ]

最佳答案

我试过你的代码,它工作正常! haarcascade_frontalface_alt.xml 文件位置只有一个问题。尝试使用文件的完整路径:face_cascade= new CascadeClassifier("D:/HelloCV/src/haarcascade_frontalface_alt.xml");

关于opencv - Java 中的 CascadeClassifier 找不到带有网络摄像头的人脸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17382499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com