Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测OpenCV 2.4.8中的多尺度参数,Java_Java_Opencv_Parameters - Fatal编程技术网

检测OpenCV 2.4.8中的多尺度参数,Java

检测OpenCV 2.4.8中的多尺度参数,Java,java,opencv,parameters,Java,Opencv,Parameters,我正在尝试使用OpenCV 2.4.8和使用detectMultiScale的Java从视频流中检测人脸。在网上搜索时,我注意到它有两个不同的参数列表版本。比如: 当我在代码中使用它时,会出现一个错误: OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat 调试代码时,我看到错误出现在第行: face_cascade.detectMul

我正在尝试使用OpenCV 2.4.8和使用detectMultiScale的Java从视频流中检测人脸。在网上搜索时,我注意到它有两个不同的参数列表版本。比如:

当我在代码中使用它时,会出现一个错误:

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat
调试代码时,我看到错误出现在第行:

face_cascade.detectMultiScale(frame_gray, faces);
我对这两个参数的方法感到困惑,因为在OpenCV文档站点中,它们只有一个带有七个参数的方法

detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())
detectMultiScale(常数矩阵和图像,向量和对象,双尺度因子=1.1,int-minNeighbors=3,int-flags=0,Size-minSize=Size(),Size-maxSize=Size())
谁能描述一下这个双参数方法是什么,它和我代码中的错误有什么联系吗。以下是我检查的代码:

 import org.opencv.core.Core;
 import org.opencv.core.Mat;
 import org.opencv.core.MatOfRect;
 import org.opencv.core.Point;
 import org.opencv.core.Rect;
 import org.opencv.core.Scalar;
 import org.opencv.core.Size;
 import org.opencv.highgui.Highgui;
 import org.opencv.highgui.VideoCapture;
 import org.opencv.imgproc.Imgproc;
 import org.opencv.objdetect.CascadeClassifier;

 public class FaceDetectSVM {

/**
 * @param args
 */ 

public static void main(String[] args) {

    //load opencv native library
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);



    CascadeClassifier face_cascade = new CascadeClassifier("haarcascade_frontalface_alt.xml");
    CascadeClassifier eyes_cascade = new CascadeClassifier("haarcascade_eye.xml");
    String window_name = "Capture - Face detection.jpg";

    System.out.println("capture through camera "+Core.VERSION);


    //load the face xml cascade
    if(!face_cascade.load("haarcascade_frontalface_alt.xml"))
    {
        System.out.println("Error loading face cascade");
    }
    else
    {
        System.out.println("Success loading face cascade");
    }

    //load the eyes xml cascade
    if(!eyes_cascade.load("haarcascade_eye.xml"))
    {
        System.out.println("Error loading eyes cascade");
    }
    else
    {
        System.out.println("Success loading eyes cascade");
    }

    //detect default camera
    VideoCapture capture = new VideoCapture(0);

    if(!capture.isOpened())
    {
        System.out.println("Did not connected to camera.");
    }
    else
    {
        System.out.println("Conected to camera: "+capture.toString());
    }

    //create new Mat image
    Mat frame = new Mat();
    while(true){
    capture.retrieve(frame);

    Mat frame_gray = new Mat();
    Imgproc.cvtColor(frame, frame_gray, Imgproc.COLOR_BGRA2GRAY);
    Imgproc.equalizeHist(frame_gray, frame_gray);


    MatOfRect faces = new MatOfRect();

    face_cascade.detectMultiScale(frame_gray, faces);


    Rect[] facesArray = faces.toArray();

    for(int i=0; i<facesArray.length; i++)
    {
        Point center = new Point(facesArray[i].x + facesArray[i].width * 0.5, facesArray[i].y + facesArray[i].height * 0.5);
         Core.ellipse(frame, center, new Size(facesArray[i].width * 0.5, facesArray[i].height * 0.5), 0, 0, 360, new Scalar(255, 0, 255), 4, 8, 0);

         Mat faceROI = frame_gray.submat(facesArray[i]);
         MatOfRect eyes = new MatOfRect();

         //-- In each face, detect eyes
         eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0,new Size(30,30), new Size());            

         Rect[] eyesArray = eyes.toArray();

         for (int j = 0; j < eyesArray.length; j++)
         {
            Point center1 = new Point(facesArray[i].x + eyesArray[i].x + eyesArray[i].width * 0.5, facesArray[i].y + eyesArray[i].y + eyesArray[i].height * 0.5);
            int radius = (int) Math.round((eyesArray[i].width + eyesArray[i].height) * 0.25);
            Core.circle(frame, center1, radius, new Scalar(255, 0, 0), 4, 8, 0);
         }
    }

    Highgui.imwrite(window_name, frame);
    capture.release();


    }

}

}
import org.opencv.core.core;
导入org.opencv.core.Mat;
导入org.opencv.core.MatOfRect;
导入org.opencv.core.Point;
导入org.opencv.core.Rect;
导入org.opencv.core.Scalar;
导入org.opencv.core.Size;
导入org.opencv.highgui.highgui;
导入org.opencv.highgui.VideoCapture;
导入org.opencv.imgproc.imgproc;
导入org.opencv.objdetect.CascadeClassifier;
公共类FaceDetectSVM{
/**
*@param args
*/ 
公共静态void main(字符串[]args){
//加载opencv本机库
System.loadLibrary(Core.NATIVE\u LIBRARY\u NAME);
CascadeClassifier face_cascade=新的cascade分类器(“haarcascade_frontalface_alt.xml”);
CascadeClassifier eyes_cascade=新的CascadeClassifier(“haarcascade_eye.xml”);
String window_name=“Capture-Face detection.jpg”;
System.out.println(“通过摄像头捕获”+核心版);
//加载面xml级联
如果(!face_cascade.load(“haarcascade_frontalface_alt.xml”))
{
System.out.println(“错误加载面级联”);
}
其他的
{
System.out.println(“成功加载面级联”);
}
//加载xml级联
如果(!eyes\u cascade.load(“haarcascade\u eye.xml”))
{
System.out.println(“错误加载眼级联”);
}
其他的
{
System.out.println(“成功加载眼睛级联”);
}
//检测默认摄像机
视频捕获=新视频捕获(0);
如果(!capture.isOpened())
{
System.out.println(“未连接到摄像头”);
}
其他的
{
System.out.println(“连接到摄像头:+capture.toString());
}
//创建新的Mat图像
垫架=新垫();
while(true){
捕获。检索(帧);
垫框_灰色=新垫();
Imgproc.cvt颜色(帧、帧灰、Imgproc.COLOR\u BGRA2GRAY);
Imgproc.equalizeHist(帧灰,帧灰);
MatOfRect面=新的MatOfRect();
面层叠。检测多尺度(帧灰,面);
Rect[]facesArray=faces.toArray();

对于java(C++)java语言包装器允许通过JNI访问本机代码。与C++不同,Java不支持默认参数值。该文档是C++的,因此有一个函数有5个默认参数值。为了说明这个问题,OpenCV Java包装器有6种方法。您所得到的错误,理想上不应该是因为这个

试试下面

  • capture.release()
    
    while(!done){…}
  • capture.retrieve(frame);
    之后,添加
    if(frame.empty()){continue;}
  • 谢谢你的帮助:)无论如何,我都可以纠正它并获得所需的输出。仍然在用Java学习OpenCV的基础知识。
     import org.opencv.core.Core;
     import org.opencv.core.Mat;
     import org.opencv.core.MatOfRect;
     import org.opencv.core.Point;
     import org.opencv.core.Rect;
     import org.opencv.core.Scalar;
     import org.opencv.core.Size;
     import org.opencv.highgui.Highgui;
     import org.opencv.highgui.VideoCapture;
     import org.opencv.imgproc.Imgproc;
     import org.opencv.objdetect.CascadeClassifier;
    
     public class FaceDetectSVM {
    
    /**
     * @param args
     */ 
    
    public static void main(String[] args) {
    
        //load opencv native library
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
    
    
        CascadeClassifier face_cascade = new CascadeClassifier("haarcascade_frontalface_alt.xml");
        CascadeClassifier eyes_cascade = new CascadeClassifier("haarcascade_eye.xml");
        String window_name = "Capture - Face detection.jpg";
    
        System.out.println("capture through camera "+Core.VERSION);
    
    
        //load the face xml cascade
        if(!face_cascade.load("haarcascade_frontalface_alt.xml"))
        {
            System.out.println("Error loading face cascade");
        }
        else
        {
            System.out.println("Success loading face cascade");
        }
    
        //load the eyes xml cascade
        if(!eyes_cascade.load("haarcascade_eye.xml"))
        {
            System.out.println("Error loading eyes cascade");
        }
        else
        {
            System.out.println("Success loading eyes cascade");
        }
    
        //detect default camera
        VideoCapture capture = new VideoCapture(0);
    
        if(!capture.isOpened())
        {
            System.out.println("Did not connected to camera.");
        }
        else
        {
            System.out.println("Conected to camera: "+capture.toString());
        }
    
        //create new Mat image
        Mat frame = new Mat();
        while(true){
        capture.retrieve(frame);
    
        Mat frame_gray = new Mat();
        Imgproc.cvtColor(frame, frame_gray, Imgproc.COLOR_BGRA2GRAY);
        Imgproc.equalizeHist(frame_gray, frame_gray);
    
    
        MatOfRect faces = new MatOfRect();
    
        face_cascade.detectMultiScale(frame_gray, faces);
    
    
        Rect[] facesArray = faces.toArray();
    
        for(int i=0; i<facesArray.length; i++)
        {
            Point center = new Point(facesArray[i].x + facesArray[i].width * 0.5, facesArray[i].y + facesArray[i].height * 0.5);
             Core.ellipse(frame, center, new Size(facesArray[i].width * 0.5, facesArray[i].height * 0.5), 0, 0, 360, new Scalar(255, 0, 255), 4, 8, 0);
    
             Mat faceROI = frame_gray.submat(facesArray[i]);
             MatOfRect eyes = new MatOfRect();
    
             //-- In each face, detect eyes
             eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0,new Size(30,30), new Size());            
    
             Rect[] eyesArray = eyes.toArray();
    
             for (int j = 0; j < eyesArray.length; j++)
             {
                Point center1 = new Point(facesArray[i].x + eyesArray[i].x + eyesArray[i].width * 0.5, facesArray[i].y + eyesArray[i].y + eyesArray[i].height * 0.5);
                int radius = (int) Math.round((eyesArray[i].width + eyesArray[i].height) * 0.25);
                Core.circle(frame, center1, radius, new Scalar(255, 0, 0), 4, 8, 0);
             }
        }
    
        Highgui.imwrite(window_name, frame);
        capture.release();
    
    
        }
    
    }
    
    }