2014-12-09 2 views
2

Я пытаюсь обнаружить лица из видеопотока, используя OpenCV 2.4.8 с Java, используя detectMultiScale. При поиске в Интернете я заметил две его версии с разными списками параметров. Как here:detectMultiScale параметры в OpenCV 2.4.8, Java

detectMultiScale(image, faceDetections) in [here][1] and face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30)) 

Когда я использовал его в своем коде, он дает ошибку:

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat 

Когда я отладки кода я вижу, что ошибка возникает в строке:

face_cascade.detectMultiScale(frame_gray, faces); 

I 'путают с этими двумя параметрами, потому что на сайте документации OpenCV у них есть только один метод с семью параметрами.

detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=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(); 


    } 

} 

} 

ответ

1

OpenCV написан на языке C/C++. Java-оболочки позволяют получить доступ к собственному коду через JNI. В отличие от C++, Java не поддерживает значения параметров по умолчанию. Эта документация предназначена для C++ и поэтому имеет одну функцию с 5 значениями параметров по умолчанию. Чтобы покрыть это, оболочка OpenCV Java имеет 6 методов. Ошибка, которую вы получаете, в идеале не должна быть из-за этого.

Попробуйте ниже.

  1. capture.release() вызывается в цикле. Выпуск должен происходить вне цикла. Используйте как
    while(!done) { ... }
  2. После capture.retrieve(frame); добавьте if(frame.empty()) { continue; }
+0

Спасибо за помощь :) в любом случае я мог исправить его и получить требуемую мощность. Все еще изучает основы OpenCV с Java. – enthu

+0

@enthu В чем была основная причина ошибки? – Kiran

Смежные вопросы