1
 /* Now allocate the buffer */
int dataBufferSize=(int)(optimalSize.height*optimalSize.width*(ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())/8.0)); 
   mBuffer= new byte[dataBufferSize];
/* The buffer where the current frame will be copied */
   mFrame = new byte[dataBufferSize];
   mCamera.addCallbackBuffer(mBuffer);

 mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() 
{
     private long timestamp=0;
     public synchronized void onPreviewFrame(byte[] data, Camera camera) 
     {
        System.arraycopy(data, 0, mFrame, 0, data.length);
        Log.i("Completed copying date","Ready for processing");
        try{
              camera.addCallbackBuffer(mBuffer);
           }catch (Exception e) 
           {
             Log.e("Camera", "addCallbackBuffer error");
             return;
           }
                return;
    }
});   






void EyeBlink::blink(IplImage* frame)

    {
        CvSeq*  comp = 0;
        CvRect  window, eye;
        int     key, nc, found;
        int     text_delay, stage = STAGE_INIT;
        int     valueBlink =0;


        int delay, i;

        capture = cvCaptureFromCAM(0);
        if (!capture)
            //exit_nicely("Cannot initialize camera!");

        cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH,  FRAME_WIDTH);
        cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, FRAME_HEIGHT);

        frame = cvQueryFrame(capture);
        if (!frame)
            exit_nicely("cannot query frame!");

        cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.4, 0.4, 0, 1, 8);
        cvNamedWindow(wnd_name, 1);

        /*for (delay = 20, i = 0; i < 6; i++, delay = 20)
            while (delay)
            {
                frame = cvQueryFrame(capture);
                if (!frame)
                    exit_nicely("cannot query frame!");
                DRAW_TEXT(frame, msg[i], delay, 0);
                cvShowImage(wnd_name, frame);
                cvWaitKey(30);
            }*/

        storage = cvCreateMemStorage(0);
        if (!storage)
            exit_nicely("cannot allocate memory storage!");

        kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS, NULL);
        gray   = cvCreateImage(cvGetSize(frame), 8, 1);
        prev   = cvCreateImage(cvGetSize(frame), 8, 1);
        diff   = cvCreateImage(cvGetSize(frame), 8, 1);
        tpl    = cvCreateImage(cvSize(TPL_WIDTH, TPL_HEIGHT), 8, 1);

        if (!kernel || !gray || !prev || !diff || !tpl)
            exit_nicely("system error.");

        gray->origin  = frame->origin;
        prev->origin  = frame->origin;
        diff->origin  = frame->origin;

        cvNamedWindow(wnd_debug, 1);
        while (key != 'q')
        {
                   int t=100;
            frame = cvQueryFrame(capture);
            if (!frame)
                exit_nicely("cannot query frame!");
            frame->origin = 0;

            if (stage == STAGE_INIT)
                window = cvRect(0, 0, frame->width, frame->height);

            cvCvtColor(frame, gray, CV_BGR2GRAY);

            nc = get_connected_components(gray, prev, window, &comp);

            if (stage == STAGE_INIT && is_eye_pair(comp, nc, &eye))
            {
                 int i;

                            for (i = 0; i < 5; i++)
                            {
                                  frame = frame1[i];
                                   if (!frame)
                                        exit_nicely("cannot query frame");
                                         cvShowImage(wnd_name, frame);
                                    if (diff)
                                          cvShowImage(wnd_debug, diff);
                                        cvWaitKey(30);
                             }

                cvSetImageROI(gray, eye);
                cvCopy(gray, tpl, NULL);
                cvResetImageROI(gray);

                stage = STAGE_TRACKING;
                text_delay = 10;
            }

            if (stage == STAGE_TRACKING)
            {
                found = locate_eye(gray, tpl, &window, &eye);

                if (!found || key == 'r')
                    stage = STAGE_INIT;

                if (is_blink(comp, nc, window, eye))
                    text_delay = 10;

                DRAW_RECTS(frame, diff, window, eye);
                DRAW_TEXT(frame, "blink!", text_delay, 1);
            }

            cvShowImage(wnd_name, frame);
            cvShowImage(wnd_debug, diff);
            prev = (IplImage*)cvClone(gray);
            key  = cvWaitKey(15);
                    t--;
        }

        exit_nicely(NULL);

    }

我正在研究眨眼检测,但遇到了一些挑战。首先,我在 android 中使用 setPreviewCallbackwithBuffer 方法捕获帧并缓冲它们,但我的问题是如何利用以字节为单位存储的帧。这意味着从上面的代码中消除 cvCameraFromCam 和 cvQueryFrame 函数。

4

0 回答 0