简体   繁体   English

我无法在Eclipse(Juno)上使用JavaCV从面部检测和识别代码示例代码中获得任何输出。

[英]I cant get any output from the Sample Code of Face Detection and recognition code using JavaCV on Eclipse(Juno).

I was practicing on some face recognition and detection codes using Java on JavaCv on Eclpise Juno. 我正在使用Eclpise Juno上的JavaCv上的Java进行一些面部识别和检测代码的练习。 The Thing is i was trying to run the sample code below but i cant get the expected result or output. 事情是我试图运行下面的示例代码,但我无法获得预期的结果或输出。 The sample code is as follows 示例代码如下

 import com.googlecode.javacpp.Loader;
 import com.googlecode.javacv.*;
 import com.googlecode.javacv.cpp.*;
 import static com.googlecode.javacv.cpp.opencv_core.*;
 import static com.googlecode.javacv.cpp.opencv_imgproc.*;
 import static com.googlecode.javacv.cpp.opencv_calib3d.*;
 import static com.googlecode.javacv.cpp.opencv_objdetect.*;

public class Demo {
  public static void main(String[] args) throws Exception {
     String classifierName = null;
     if (args.length > 0) {
         classifierName = args[0];
     } else {
         System.err.println("C://opencv/data/haarcascades\"haarcascade_frontalface_alt.xml\".");
         System.exit(1);
  }

  // Preload the opencv_objdetect module to work around a known bug.
  Loader.load(opencv_objdetect.class);

  // We can "cast" Pointer objects by instantiating a new object of the desired class.
  CvHaarClassifierCascade classifier = new CvHaarClassifierCascade(cvLoad(classifierName));
  if (classifier.isNull()) {
     System.err.println("Error loading classifier file \"" + classifierName + "\".");
     System.exit(1);
  }

// CanvasFrame is a JFrame containing a Canvas component, which is hardware accelerated.
// It can also switch into full-screen mode when called with a screenNumber.
CanvasFrame frame = new CanvasFrame("Some Title");

// OpenCVFrameGrabber uses opencv_highgui, but other more versatile FrameGrabbers
// include DC1394FrameGrabber, FlyCaptureFrameGrabber, OpenKinectFrameGrabber,
// PS3EyeFrameGrabber, VideoInputFrameGrabber, and FFmpegFrameGrabber.
FrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();

// FAQ about IplImage:
// - For custom raw processing of data, getByteBuffer() returns an NIO direct
//   buffer wrapped around the memory pointed by imageData.
// - To get a BufferedImage from an IplImage, you may call getBufferedImage().
// - The createFrom() factory method can construct an IplImage from a BufferedImage.
// - There are also a few copy*() methods for BufferedImage<->IplImage data transfers.
IplImage grabbedImage = grabber.grab();
int width  = grabbedImage.width();
int height = grabbedImage.height();
IplImage grayImage    = IplImage.create(width, height, IPL_DEPTH_8U, 1);
IplImage rotatedImage = grabbedImage.clone();

// Let's create some random 3D rotation...
CvMat randomR = CvMat.create(3, 3), randomAxis = CvMat.create(3, 1);
// We can easily and efficiently access the elements of CvMat objects
// with the set of get() and put() methods.
randomAxis.put((Math.random()-0.5)/4, (Math.random()-0.5)/4, (Math.random()-0.5)/4);
cvRodrigues2(randomAxis, randomR, null);
double f = (width + height)/2.0;        randomR.put(0, 2, randomR.get(0, 2)*f);
                                        randomR.put(1, 2, randomR.get(1, 2)*f);
randomR.put(2, 0, randomR.get(2, 0)/f); randomR.put(2, 1, randomR.get(2, 1)/f);
System.out.println(randomR);

// Objects allocated with a create*() or clone() factory method are automatically released
// by the garbage collector, but may still be explicitly released by calling release().
// You shall NOT call cvReleaseImage(), cvReleaseMemStorage(), etc. 
//on objects allocated    this way.
CvMemStorage storage = CvMemStorage.create();

// We can allocate native arrays using constructors taking an integer as argument.
CvPoint hatPoints = new CvPoint(3);

// Again, FFmpegFrameRecorder also exists as a more versatile alternative.
FrameRecorder recorder = new OpenCVFrameRecorder("output.avi", width, height);
recorder.start();

while (frame.isVisible() && (grabbedImage = grabber.grab()) != null) {
    cvClearMemStorage(storage);

    // Let's try to detect some faces! but we need a grayscale image...
    cvCvtColor(grabbedImage, grayImage, CV_BGR2GRAY);
    CvSeq faces = cvHaarDetectObjects(grayImage, classifier, storage,
            1.1, 3, CV_HAAR_DO_CANNY_PRUNING);
    int total = faces.total();
    for (int i = 0; i < total; i++) {
        CvRect r = new CvRect(cvGetSeqElem(faces, i));
        int x = r.x(), y = r.y(), w = r.width(), h = r.height();
        cvRectangle(grabbedImage, cvPoint(x, y), cvPoint(x+w, y+h), CvScalar.RED, 1, CV_AA, 0);

        // To access the elements of a native array, use the position() method.
        hatPoints.position(0).x(x-w/10)   .y(y-h/10);
        hatPoints.position(1).x(x+w*11/10).y(y-h/10);
        hatPoints.position(2).x(x+w/2)    .y(y-h/2);
        cvFillConvexPoly(grabbedImage, hatPoints.position(0), 3, CvScalar.GREEN, CV_AA, 0);
    }

    // Let's find some contours! but first some thresholding...
    cvThreshold(grayImage, grayImage, 64, 255, CV_THRESH_BINARY);

    // To check if an output argument is null we may call either isNull() or equals(null).
    CvSeq contour = new CvSeq(null);
    cvFindContours(grayImage, storage, contour, Loader.sizeof(CvContour.class),
            CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
    while (contour != null && !contour.isNull()) {
        if (contour.elem_size() > 0) {
            CvSeq points = cvApproxPoly(contour, Loader.sizeof(CvContour.class),
                    storage, CV_POLY_APPROX_DP, cvContourPerimeter(contour)*0.02, 0);
            cvDrawContours(grabbedImage, points, CvScalar.BLUE, CvScalar.BLUE, -1, 1, CV_AA);
        }
        contour = contour.h_next();
    }

    cvWarpPerspective(grabbedImage, rotatedImage, randomR);

    frame.showImage(rotatedImage);
    recorder.record(rotatedImage);
    }
   recorder.stop();
   grabber.stop();
   frame.dispose();
 }
 }

The Output i am getting is a line printed in red and its like. 我得到的输出是用红色及其类似图形打印的一行。

C://opencv/data/haarcascades"haarcascade_frontalface_alt.xml". C:// opencv / data / haarcascades“ haarcascade_frontalface_alt.xml”。

Can anybody show what i missed? 有人可以显示我错过的内容吗? I am new to image processing and so please can anyone indicate me where i could get good tutorials and sample source codes that could teach me how to master all the in-built functions in JavaCv and their functionalities? 我是图像处理的新手,所以任何人都可以指出我在哪里可以得到好的教程和示例源代码,这些课程可以教我如何掌握JavaCv中的所有内置函数及其功能? I was working on my final year project and really need your hand on this one. 我当时正在做我的最后一年的项目,确实需要您的帮助。 With lots of respect Sisay 十分尊重Sisay

haarcascade_frontalface_alt.xml is trained classifier for detecting frontal face. haarcascade_frontalface_alt.xml是经过训练的分类器,用于检测正面人脸。 It is usually present in opencv_installation_folder/opencv/data/haarcascade folder. 它通常存在于opencv_installation_folder / opencv / data / haarcascade文件夹中。 you can give the direct path of your classifier instead of taking it from command line as 您可以提供分类器的直接路径,而不必从命令行中获取

classifierName = opencv_installation_folder/opencv/data/harcascade/haarcascade_frontalface_alt.xml

that demo expects you to give it the cascade-file as an argument. 该演示程序希望您将其级联文件作为参数。 it just stops, if it does not get one. 如果没有,它只会停止。

maybe you want to change the beginning like this: 也许您想这样改变开始:

public class Demo {
  public static void main(String[] args) throws Exception {
     String classifierName = "C:/opencv/data/haarcascades/haarcascade_frontalface_alt.xml";
     if (args.length > 0) {
         classifierName = args[0];
     }

like that, it takes an arg from cmdline if present, else it takes the default-value 这样,如果存在,它将从cmdline中获取一个arg,否则它将使用默认值

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM