需要在同一帧上显示从Frame Grabber抓取的图像

时间:2013-08-30 10:53:02

标签: java opencv face-detection javacv face-recognition

我可以使用Frame Grabber流式传输视频并捕获检测到的面部,现在我想显示从Frame Grabber类中抓取的图像,并且需要显示在同一帧上,即显示在视频流的一侧。

\ code使用帧抓取器类从视频捕获帧。 包com.ravi.videotoimages;

import static com.googlecode.javacv.cpp.opencv_core.CV_AA;
import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U;
import static com.googlecode.javacv.cpp.opencv_core.cvClearMemStorage;
import static com.googlecode.javacv.cpp.opencv_core.cvCreateImage;
import static com.googlecode.javacv.cpp.opencv_core.cvGetSeqElem;
import static com.googlecode.javacv.cpp.opencv_core.cvGetSize;
import static com.googlecode.javacv.cpp.opencv_core.cvLoad;
import static com.googlecode.javacv.cpp.opencv_core.cvPoint;
import static com.googlecode.javacv.cpp.opencv_core.cvRectangle;
import static com.googlecode.javacv.cpp.opencv_core.cvSetImageROI;
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvShowImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvWaitKey;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_BGR2GRAY;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvCvtColor;
import static com.googlecode.javacv.cpp.opencv_objdetect.CV_HAAR_DO_CANNY_PRUNING;
import static com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects;

import com.googlecode.javacpp.Loader;
import com.googlecode.javacv.FrameGrabber;
import com.googlecode.javacv.FrameGrabber.Exception;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.cpp.opencv_core.CvMemStorage;
import com.googlecode.javacv.cpp.opencv_core.CvRect;
import com.googlecode.javacv.cpp.opencv_core.CvScalar;
import com.googlecode.javacv.cpp.opencv_core.CvSeq;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import com.googlecode.javacv.cpp.opencv_objdetect;
import com.googlecode.javacv.cpp.opencv_objdetect.CvHaarClassifierCascade;
//import static com.googlecode.javacv.cpp.opencv_highgui.cvNamedWindow;
//import com.googlecode.javacv.CanvasFrame;
//import com.googlecode.javacv.VideoInputFrameGrabber;

public class faceRecongitionwitdetection {

    public static final String XML_FILE = "D:\\l\\OpenCV\\haarcascade_frontalface_default.xml";
    private static final int SCALE = 1;

    @SuppressWarnings("unused")
    private static boolean isRunning = true;

    @SuppressWarnings("unused")
    public static void main(String[] args) throws Exception {

        // CanvasFrame canvas = new CanvasFrame("Camera");
        // canvas.setDefaultCloseOperation(CanvasFrame.EXIT_ON_CLOSE);
        // canvas.addWindowListener(new SetBoolean());

        IplImage image;

        FrameGrabber grabber = new OpenCVFrameGrabber("D:\\l\\OpenCV\\jobs.mp4");

        if (grabber == null) {
            System.out.println("!!! Failed OpenCVFrameGrabber");
            return;
        }

        try {
            grabber.start();
            IplImage frame = null;
            int i = 1;
            int frame_counter = 1;
            while (true) {
                frame = grabber.grab();
                if (frame == null) {
                    System.out.println("!!! Failed grab");
                    break;
                }
                IplImage grayImg = cvCreateImage(cvGetSize(frame),
                        IPL_DEPTH_8U, 1);
                cvCvtColor(frame, grayImg, CV_BGR2GRAY);
                if ((frame_counter % 500) == 0) {

                    // cvSaveImage(i + "teja.jpg", grayImg);

                    detect(grayImg);

                    cvShowImage("Result", grayImg);

                    cvSaveImage(i + "teja.jpg", grayImg);
                    String xyz = i + "teja.jpg";
                    detector(xyz);

                }

                int key = cvWaitKey(1);
                if (key == 100) {
                    break;
                }

                frame_counter++;
                i++;
            }

        } catch (Exception e) {
            System.out.println("!!! Exception");
        }
    }

    public static void detect(IplImage src) {
        // IplImage grayImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
        // cvCvtColor(src, grayImg, CV_BGR2GRAY);

        CvHaarClassifierCascade cascade = new CvHaarClassifierCascade(
                cvLoad(XML_FILE));
        CvMemStorage storage = CvMemStorage.create();
        CvSeq sign = cvHaarDetectObjects(src, cascade, storage, 3, 2,
                CV_HAAR_DO_CANNY_PRUNING);

        cvClearMemStorage(storage);

        int total_Faces = sign.total();

        for (int i = 0; i < total_Faces; i++) {
            CvRect r = new CvRect(cvGetSeqElem(sign, i));
            cvRectangle(src, cvPoint(r.x(), r.y()),
                    cvPoint(r.width() + r.x(), r.height() + r.y()),
                    CvScalar.GREEN, 3, CV_AA, 0);
        }
    }

    public static void detector(String grab) {
        if (grab.length() < 0) {
            System.out.println("No Input File");
            return;
        }

        System.out.println("Starting OpenCV...");

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

        // load an image
        System.out.println("Loading image from " + grab);
        IplImage origImg = cvLoadImage(grab);

        IplImage grayImg = cvCreateImage(cvGetSize(origImg), IPL_DEPTH_8U, 1);
        cvCvtColor(origImg, grayImg, CV_BGR2GRAY);
        CvMemStorage storage = CvMemStorage.create();
        CvHaarClassifierCascade cascade = new CvHaarClassifierCascade(
                cvLoad(XML_FILE));
        System.out.println("Detecting faces...");
        CvSeq faces = cvHaarDetectObjects(grayImg, cascade, storage, 3, 2,
                CV_HAAR_DO_CANNY_PRUNING);
        cvClearMemStorage(storage);

        // iterate over the faces and draw yellow rectangles around them
        int total = faces.total();
        System.out.println("Found " + total + " face(s)");
        for (int i = 0; i < total; i++) {
            CvRect r = new CvRect(cvGetSeqElem(faces, i));

            cvSetImageROI(grayImg, r);
            cvRectangle(grayImg, cvPoint(r.x() * SCALE, r.y() * SCALE), // undo
                                                                        // the
                                                                        // scaling
                    cvPoint((r.x() + r.width()) * SCALE, (r.y() + r.height())

                    * SCALE), CvScalar.BLUE, 6, CV_AA, 0);

            if (total > 0) {
                // int j=1;
                System.out.println("Saving marked-faces version of " + grab
                        + " in " + grab);
                cvSaveImage(grab, grayImg);

            }
        }
    }
}

帮助我如何完成任务。任何建议都将不胜感激。 谢谢。

0 个答案:

没有答案