美文网首页
利用CIFilter给视频流加滤镜

利用CIFilter给视频流加滤镜

作者: Owl_City_Gx | 来源:发表于2017-07-20 19:01 被阅读147次
    利用CIFilter给视频流加滤镜 利用CIFilter给视频流加滤镜

    最近公司出新需求,要给视频流加滤镜,考虑到使用GPUImage会影响到我们现有的人脸识别、人脸追踪功能,我们选择在拿到视频流之后利用CIFilter加滤镜这样子的做法。 在获取视频流的回调方法中酱紫处理一下就好了。
    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {

    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CIImage *ciImage = [CIImage imageWithCVImageBuffer:imageBuffer];
    
    self.filter = [CIFilter filterWithName:@"CIToneCurve"];
    [self.filter setValue:ciImage forKey:@"inputImage"];
    
    CIImage *outputImage = [self.filter outputImage];
    CGImageRef outputImageRef = [self.ciContext createCGImage:outputImage fromRect:outputImage.extent];
    
    dispatch_sync(dispatch_get_main_queue(), ^{
        self.preView.layer.contents = (__bridge id _Nullable)(outputImageRef);
    });
    
    CGImageRelease(outputImageRef);}
    

    preView是用来显示加了滤镜之后的视图。
    如果你在项目中使用AVCaptureVideoPreviewLayer来显示数据,你就会发现,不管你怎么处理数据流,它都跟死鱼一样不会有任何改变!!!因为AVCaptureVideoPreviewLayer会自动显示相机拍到实时预览图。不要问我为什么特意补充这个事情...不要问不要问不要问!!!
    所以,如果你想要在得到的流数据上加一层滤镜,那就自己做一个视图来解决拉。唔,这样子拿到的数据流显示在视图上会有90°的偏差,因为CIImage的坐标别出一格的原因,需要寄己手动transform一下就OK了。

    相关文章

      网友评论

          本文标题:利用CIFilter给视频流加滤镜

          本文链接:https://www.haomeiwen.com/subject/lxyjkxtx.html