首页 > 其他分享 >iOS MachineLearning 系列(9)—— 人物蒙版图生成

iOS MachineLearning 系列(9)—— 人物蒙版图生成

时间:2023-04-27 23:32:32浏览次数:49  
标签:蒙版 版图 MachineLearning request frame iOS outputImage let image

iOS MachineLearning 系列(9)—— 人物蒙版图生成

人物蒙版图能力是Vision框架在iOS 15中新增的功能,这个功能可以将图片中的人物按照轮廓生成无光蒙版。无光蒙版在实际业务中非常有用,使用此蒙版可以方便的将人物从图片中提取出来,然后和其他的背景图进行合成。

1 - 人物蒙版的提取

首先,人物蒙版的提取非常简单,使用VNGeneratePersonSegmentationRequest创建蒙版分析请求,如下:

private lazy var personRequest: VNGeneratePersonSegmentationRequest = {
    let request = VNGeneratePersonSegmentationRequest { request, error in
        DispatchQueue.main.async {
            self.drawTask(request: request as! VNGeneratePersonSegmentationRequest)
        }
    }
    return request
}()

使用VNImageRequestHandler来触发请求即可:

// 要分析的图片资源
let image = UIImage(named: "image7")!

// 图像分析请求
lazy var imageRequestHandler = VNImageRequestHandler(ciImage: CIImage(cgImage: image.cgImage!),
                                                orientation: .up,
                                                options: [:])

请求的结果VNPixelBufferObservation中会封装蒙版图片CVPixelBuffer数据,如下:

open class VNPixelBufferObservation : VNObservation {
    // 分析出的蒙版数据
    open var pixelBuffer: CVPixelBuffer { get }
    // 分析所使用的模型
    open var featureName: String? { get }
}

处理请求结果如下:

private func drawTask(request: VNGeneratePersonSegmentationRequest) {

    for result in request.results ?? [] {
        // 创建CIImage实例
        let ciImage = CIImage(cvPixelBuffer: result.pixelBuffer)
        // 默认返回的蒙版为黑白两色,这里讲所有黑色替换成透明色
        let filter = CIFilter(name: "CIMaskToAlpha", parameters: [kCIInputImageKey: ciImage])
        guard let outputImage = filter?.outputImage else { return }
        let context = CIContext(options: nil)
        let cgImage = context.createCGImage(outputImage, from: outputImage.extent)
        let uiImage = UIImage(cgImage: cgImage!)
        
        let v = UIImageView(image: uiImage)
        v.frame = imageView.frame
        v.backgroundColor = .black
        v.frame.origin.y += imageView.frame.height
        v.image = uiImage
        view.addSubview(v)
    }
}

效果如下图:

2 - 进行人物提取

获取到了蒙版,提取人物将很简单,修改上述代码如下:

private func drawTask(request: VNGeneratePersonSegmentationRequest) {

    for result in request.results ?? [] {
        print(result.pixelBuffer)
        let ciImage = CIImage(cvPixelBuffer: result.pixelBuffer)
        
        let filter = CIFilter(name: "CIMaskToAlpha", parameters: [kCIInputImageKey: ciImage])
        
        guard let outputImage = filter?.outputImage else { return }
        let context = CIContext(options: nil)
        let cgImage = context.createCGImage(outputImage, from: outputImage.extent)
        let uiImage = UIImage(cgImage: cgImage!)
        
        
        let v = UIImageView(image: uiImage)
        v.frame = imageView.frame
        v.backgroundColor = .blue
        v.frame.origin.y += imageView.frame.height

        v.image = uiImage
        view.addSubview(v)
        
        
        
        let v2 = UIImageView(image: image)
        v2.frame = v.frame
        v2.frame.origin.y += v.frame.height
        
        let mask =  UIImageView(image: uiImage)
        mask.frame = CGRect(x: 0, y: 0, width: v2.frame.size.width, height: v2.frame.size.height)
        mask.backgroundColor = .clear
        // 使用蒙版截取
        v2.mask = mask
        view.addSubview(v2)
    }
}

效果如下:

完整的示例代码可以在如下地址找到:

https://github.com/ZYHshao/MachineLearnDemo

VNGeneratePersonSegmentationRequest结合CIFilter的使用,可以方便的进行背景合成。

标签:蒙版,版图,MachineLearning,request,frame,iOS,outputImage,let,image
From: https://blog.51cto.com/u_11643026/6232513

相关文章

  • iOS APP启动广告实现方式 与 APP唤端调用
    APP启动广告功能实现要从2个方面思考一是UI方案,怎样处理广告页与主页之间的切换方式。二是广告页展示时机,是使用后台实时广告数据还是使用本地缓存广告数据。后台数据方式获取广告最新但是用户要等待后台返回数据后才能展示,增加用户等待时间。使用本地缓存启动速度快但数据更新......
  • JS通过axios提交application/x-www-form-urlencoded类型的数据
    使用axios提交类型为application/x-www-form-urlencoded数据的正确姿势:letformData=newURLSearchParams()formData.append('param1',param1)formData.append('param2',param2)axios({url:'http://xxx.xxx.xxx.xxx/xxx',method:'......
  • Unity跟IOS原生开发项目融合
    更多精品文章Aladdin的博客需求:做一款社交类的APP,主体工程是原生开发,也就是是IOS的Xcode工程,产品经理为了丰富应用的玩法,就想往里面加上现在比较流行的AR功能,组成一款AR社交APP,我们之前见识多的都是工程是主体,然后IOS原生功能或者代码作为插件添加进Unity的Plugin里面,这样的方式参......
  • IOS内购数据拉取
    目标:拉取appstoreconnect内购数据拉取,自己做数据报表。1:api秘钥接口需要token,token生成需要秘钥。参考官方文档:https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api 。  vendorNumber在这个界面查找: ......
  • 使用axios下载文件
    使用axios下载文件/***下载文件*@param{string}url下载地址*@param{string}fileName文件名,例:1.png*/exportfunctiondownload(url,fileName){axios({url:url,method:'GET',responseType:'blob',}).then((r......
  • How to use axios.js instead of request.js to get data as a buffer All In One
    Howtouseaxios.jsinsteadofrequest.jstogetdataasabufferAllInOne如何使用axios.js代替request.js获取数据作为缓冲区questionconstfs=require("fs");varpath=require("path");const{exit}=require("process");//requ......
  • iOS描述文件(.mobileprovision)一键申请
    转载:IOS描述文件制作教程iOS描述文件(.mobileprovision)一键申请在主界面上点击描述文件按钮。​编辑切换为居中添加图片注释,不超过140字(可选)  新建ios描述文件然后点击新建,然后输入描述文件名称,描述文件名称字符和数字,自己好辨识就可以。......
  • iOS MachineLearning 系列(5)—— 视频中的物体运动追踪
    iOSMachineLearning系列(5)——视频中的物体运动追踪本系列的前面几篇文章中,我们将静态图片分析相关的API做了详尽的介绍。在Vision框架中,还提供了视频中物体追踪的能力。仔细想来,其实视频的分析和静态图片的分析本质上并无太大的区别,我们可以将视频拆解成图片帧,之后再对图片进......
  • iOS MachineLearning 系列(4)—— 静态图像分析之物体识别与分类
    iOSMachineLearning系列(4)——静态图像分析之物体识别与分类本系列的前几篇文件,详细了介绍了Vision框架中关于静态图片区域识别的内容。本篇文章,我们将着重介绍静态图片中物体的识别与分类。物体识别和分类也是MachineLearning领域重要的应用。通过大量的图片数据进行训练后,模......
  • 如何建设一个用于编译 iOS App 的 macOS 云服务器集群?
    作者:京东零售叶萌现代软件开发一般会借助CI/CD来提升代码质量、加快发版速度、自动化重复的事情,iOSApp只能在mac机器上编译,CI/CD工具因此需要有一个macOS云服务器集群来执行iOSApp的编译。今天就来谈谈如何建设macOS云服务器集群购买macmini/MacStudio机......