gpt4 book ai didi

ios - 使用 AVCaptureVideoDataOutputSampleBufferDelegate 方法延迟执行 dispatch_async block

转载 作者:行者123 更新时间:2023-11-29 03:34:38 25 4
gpt4 key购买 nike

我目前正在开发一个涉及用于眨眼检测的 AVCaptureVideoDataOutputSampleBufferDelegate 的项目。

我在委托(delegate)方法中有以下 dispatch_async block

(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{

//Initialisation of buffer and UIImage and CIDetector, etc.

dispatch_async(dispatch_get_main_queue(), ^(void) {
if(features.count > 0){
CIFaceFeature *feature = [features objectAtIndex:0];
if([feature leftEyeClosed]&&[feature rightEyeClosed]){
flag = TRUE;
}else{
if(flag){
blinkcount++;
//Update UILabel containing blink count. The count variable is incremented from here.
}
flag = FALSE;
}
}
}

上面显示的方法被连续调用并处理来自摄像机的视频输入。 flag bool 值跟踪眼睛在最后一帧中是闭上还是睁开,以便可以检测到眨眼。有大量帧丢失,但仍然正确检测到眨眼,因此我猜处理的 fps 是足够的。

我的问题是,UILabel 在执行眨眼后经过一段相当长的延迟(约 1 秒)后才更新。这使得该应用程序看起来缓慢且不直观。我尝试在没有调度的情况下编写 UI 更新代码,但这是行不通的。我可以做些什么,以便 UILabel 在执行闪烁后立即更新吗?

最佳答案

如果没有更多代码,很难确切地知道这里发生了什么,但在调度代码之上,您会说:

//Initialisation of buffer and UIImage and CIDetector, etc.

如果您确实每次都初始化检测器,那么这可能不是最理想的 - 使其生命周期较长。我不确定初始化 CIDetector 的成本是否昂贵,但这是一个起点。另外,如果您确实在这里使用 UIImage,那也是次优的。不要通过 UIImage,采取更直接的路线:

CVImageBufferRef ib = CMSampleBufferGetImageBuffer(sampleBuffer);
CIImage* ciImage = [CIImage imageWithCVPixelBuffer: ib];
NSArray* features = [longLivedDetector featuresInImage: ciImage];

最后,在后台线程上进行特征检测,并且仅将 UILabel 更新编码(marshal)回主线程。像这样:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
if (!_longLivedDetector) {
_longLivedDetector = [CIDetector detectorOfType:CIDetectorTypeFace context: ciContext options: whatever];
}

CVImageBufferRef ib = CMSampleBufferGetImageBuffer(sampleBuffer);
CIImage* ciImage = [CIImage imageWithCVPixelBuffer: ib];
NSArray* features = [_longLivedDetector featuresInImage: ciImage];
if (!features.count)
return;

CIFaceFeature *feature = [features objectAtIndex:0];
const BOOL leftAndRightClosed = [feature leftEyeClosed] && [feature rightEyeClosed];

// Only trivial work is left to do on the main thread.
dispatch_async(dispatch_get_main_queue(), ^(void){
if (leftAndRightClosed) {
flag = TRUE;
} else {
if (flag) {
blinkcount++;
//Update UILabel containing blink count. The count variable is incremented from here.
}
flag = FALSE;
}
});
}

最后,您还应该记住,面部特征检测是一项不平凡的信号处理任务,需要大量的计算(即时间)才能完成。我希望有一天,如果硬件不变得更快,就没有办法让它变得更快。

关于ios - 使用 AVCaptureVideoDataOutputSampleBufferDelegate 方法延迟执行 dispatch_async block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19354043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com