Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.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
我无法从Eclipse(Juno)上使用JavaCV的人脸检测和识别代码示例代码中获得任何输出。_Java_Image Processing_Opencv_Face Detection_Javacv - Fatal编程技术网

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

我无法从Eclipse(Juno)上使用JavaCV的人脸检测和识别代码示例代码中获得任何输出。,java,image-processing,opencv,face-detection,javacv,Java,Image Processing,Opencv,Face Detection,Javacv,我在Eclpise Juno上使用Java on JavaCv练习一些人脸识别和检测代码。问题是,我试图运行下面的示例代码,但无法获得预期的结果或输出。示例代码如下所示 import com.googlecode.javacpp.Loader; import com.googlecode.javacv.*; import com.googlecode.javacv.cpp.*; import static com.googlecode.javacv.cpp.opencv_core.*;

我在Eclpise Juno上使用Java on JavaCv练习一些人脸识别和检测代码。问题是,我试图运行下面的示例代码,但无法获得预期的结果或输出。示例代码如下所示

 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();
 }
 }
我得到的输出是一行红色或类似的字体


C://opencv/data/haarcascadeshaarcascade_frontalface_alt.xml

谁能证明我错过了什么? 我是图像处理新手,所以有谁能告诉我在哪里可以获得好的教程和示例源代码,教我如何掌握JavaCv中的所有内置函数及其功能?我在做最后一年的项目,真的需要你的帮助。 非常尊敬地
Sisay

haarcascade_frontalface_alt.xml是经过训练的用于检测正面人脸的分类器。它通常出现在opencv\u安装\u文件夹/opencv/data/haarcascade文件夹中。您可以给出分类器的直接路径,而不是从命令行获取

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

该演示希望您将级联文件作为参数提供给它。它只是停止,如果它没有得到一个

也许你想这样改变开头:

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];
     }

这样,如果存在,它将从cmdline获取一个arg,否则它将获取默认值

请确保将图像捕获设备连接到系统,如网络摄像头。另外,请指定“haarcascade\u frontalface\u alt.xml”文件的存放位置?尝试提供完整的输出/错误日志。C://opencv/data/haarcascadeshaarcascade_frontaface_alt.xml是的,我正在使用我朋友的笔记本电脑,它内置了网络摄像头。haarcascade_frontaface_alt.xml所在的目录位于C:\opencv\data\haarcascades。我得到的输出是C://opencv/data/haarcascadeshaarcascade_frontalface_alt.xml以红色打印。