javacv示例程序没有在eclipse中运行?

时间:2012-03-23 13:54:33

标签: java eclipse 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("Please provide the path to \"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();
}
}

我从示例代码中获取了上述代码并尝试运行它。我提到了如上所述的jar文件。所有的错误和警告都消失了。但是当我运行代码时。

我收到以下错误......

java.lang.UnsatisfiedLinkError: C:\Users\Balachander P\AppData\Local\Temp\jniopencv_core7504532540941704965.dll: Can't find dependent libraries
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.load0(Unknown Source)
    at java.lang.System.load(Unknown Source)
    at com.googlecode.javacpp.Loader.load(Loader.java:352)
    at com.googlecode.javacpp.Loader.load(Loader.java:285)
    at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:129)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at com.googlecode.javacpp.Loader.load(Loader.java:305)
    at com.googlecode.javacpp.Loader.load(Loader.java:285)
    at com.googlecode.javacv.cpp.opencv_core$CvArr.<clinit>(opencv_core.java:156)
    at com.googlecode.javacv.JavaCV.<clinit>(JavaCV.java:88)

我是javacv的新手并且是第一次尝试它。有人可以帮我解决..

2 个答案:

答案 0 :(得分:1)

确保OpenCV(* .dll)的库文件可以在其默认安装目录中找到,也可以在Windows中包含当前工作目录的系统PATH中找到。 (有关Windows平台上OpenCV经常遇到的问题的答案,请参阅Windows 7下OpenCV的常见问题。)

http://code.google.com/p/javacv/

检查系统路径

答案 1 :(得分:0)

看起来opencv没有正确链接按照分步说明的链接 http://opencvlover.blogspot.in/2012/04/javacv-setup-with-eclipse-on-windows-7.html