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中使用setPreviewCallbackwithBuffer方法捕获帧并对其进行缓冲,但我的问题是如何利用以字节存储的帧。这意味着从上述代码中删除cvCameraFromCam和cvQueryFrame函数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
/* 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);
}