Android ndk Android缓冲区数据和openCV处理功能 /*现在分配缓冲区*/ int-dataBufferSize=(int)(optimizesize.height*optimizesize.width*(ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())/8.0)); mBuffer=新字节[dataBufferSize]; /*将复制当前帧的缓冲区*/ mFrame=新字节[dataBufferSize]; mCamera.addCallbackBuffer(mBuffer); mCamera.setPreviewCallbackWithBuffer(new-Camera.PreviewCallback() { 私有长时间戳=0; 公共同步的void onPreviewFrame(字节[]数据,摄像头) { System.arraycopy(数据,0,mFrame,0,数据.长度); Log.i(“完成复制日期”,“准备处理”); 试一试{ 摄像头。添加Callbackbuffer(mBuffer); }捕获(例外e) { Log.e(“摄像头”、“addCallbackBuffer错误”); 回来 } 回来 } }); 无效眼球链接::闪烁(IplImage*帧) { CvSeq*comp=0; 视窗,眼睛; int键,nc,已找到; int text_delay,stage=stage_INIT; int valueBlink=0; int延迟,i; 捕获=cvCaptureFromCAM(0); 如果(!捕获) //退出(“无法初始化相机!”); cvSetCaptureProperty(捕获、CV_CAP_PROP_FRAME_WIDTH、FRAME_WIDTH); cvSetCaptureProperty(捕捉、CV_CAP_PROP_FRAME_HEIGHT、FRAME_HEIGHT); 帧=cvQueryFrame(捕获); 如果(!帧) 很好地退出(“无法查询帧!”); cvInitFont(&font,CV_font_HERSHEY_SIMPLEX,0.4,0,1,8); cvNamedWindow(wnd_名称,1); /*对于(延迟=20,i=0;i原点=帧->原点; 上一个->原点=帧->原点; 差异->原点=帧->原点; cvNamedWindow(wnd_调试,1); while(键!=“q”) { int t=100; 帧=cvQueryFrame(捕获); 如果(!帧) 很好地退出(“无法查询帧!”); 帧->原点=0; if(stage==stage_INIT) window=cvRect(0,0,帧->宽度,帧->高度); CVT颜色(边框、灰色、CV_bgr2灰色); nc=获取连接的组件(灰色、上一个、窗口和组件); if(stage==stage\u INIT&&is\u eye\u对(comp、nc和eye)) { int i; 对于(i=0;i

Android ndk Android缓冲区数据和openCV处理功能 /*现在分配缓冲区*/ int-dataBufferSize=(int)(optimizesize.height*optimizesize.width*(ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())/8.0)); mBuffer=新字节[dataBufferSize]; /*将复制当前帧的缓冲区*/ mFrame=新字节[dataBufferSize]; mCamera.addCallbackBuffer(mBuffer); mCamera.setPreviewCallbackWithBuffer(new-Camera.PreviewCallback() { 私有长时间戳=0; 公共同步的void onPreviewFrame(字节[]数据,摄像头) { System.arraycopy(数据,0,mFrame,0,数据.长度); Log.i(“完成复制日期”,“准备处理”); 试一试{ 摄像头。添加Callbackbuffer(mBuffer); }捕获(例外e) { Log.e(“摄像头”、“addCallbackBuffer错误”); 回来 } 回来 } }); 无效眼球链接::闪烁(IplImage*帧) { CvSeq*comp=0; 视窗,眼睛; int键,nc,已找到; int text_delay,stage=stage_INIT; int valueBlink=0; int延迟,i; 捕获=cvCaptureFromCAM(0); 如果(!捕获) //退出(“无法初始化相机!”); cvSetCaptureProperty(捕获、CV_CAP_PROP_FRAME_WIDTH、FRAME_WIDTH); cvSetCaptureProperty(捕捉、CV_CAP_PROP_FRAME_HEIGHT、FRAME_HEIGHT); 帧=cvQueryFrame(捕获); 如果(!帧) 很好地退出(“无法查询帧!”); cvInitFont(&font,CV_font_HERSHEY_SIMPLEX,0.4,0,1,8); cvNamedWindow(wnd_名称,1); /*对于(延迟=20,i=0;i原点=帧->原点; 上一个->原点=帧->原点; 差异->原点=帧->原点; cvNamedWindow(wnd_调试,1); while(键!=“q”) { int t=100; 帧=cvQueryFrame(捕获); 如果(!帧) 很好地退出(“无法查询帧!”); 帧->原点=0; if(stage==stage_INIT) window=cvRect(0,0,帧->宽度,帧->高度); CVT颜色(边框、灰色、CV_bgr2灰色); nc=获取连接的组件(灰色、上一个、窗口和组件); if(stage==stage\u INIT&&is\u eye\u对(comp、nc和eye)) { int i; 对于(i=0;i,android-ndk,Android Ndk,我正在研究眨眼检测,但有一些挑战。首先,我在android中使用setPreviewCallbackwithBuffer方法捕获帧并对其进行缓冲,但我的问题是如何利用以字节存储的帧。这意味着从上述代码中删除cvCameraFromCam和cvQueryFrame函数 /* Now allocate the buffer */ int dataBufferSize=(int)(optimalSize.height*optimalSize.width*(ImageFormat.getBitsPer

我正在研究眨眼检测,但有一些挑战。首先,我在android中使用setPreviewCallbackwithBuffer方法捕获帧并对其进行缓冲,但我的问题是如何利用以字节存储的帧。这意味着从上述代码中删除cvCameraFromCam和cvQueryFrame函数

 /* 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);

    }