Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS MachineLearning 系列(5)—— 视频中的物体运动跟踪

iOS MachineLearning 系列(5)—— 视频中的物体运动跟踪

作者头像
珲少
发布于 2023-04-27 12:38:49
发布于 2023-04-27 12:38:49
72200
代码可运行
举报
文章被收录于专栏:一“技”之长一“技”之长
运行总次数:0
代码可运行

iOS MachineLearning 系列(5)—— 视频中的物体运动追踪

本系列的前面几篇文章中,我们将静态图片分析相关的API做了详尽的介绍。在Vision框架中,还提供了视频中物体追踪的能力。

仔细想来,其实视频的分析和静态图片的分析本质上并无太大的区别,我们可以将视频拆解成图片帧,之后再对图片进行静态分析。将所有图片帧的分析结果反馈到视频上,即实现了对视频的分析能力。

视频中物体运动的跟踪常在一些AR游戏中应用,这些现实增强类的应用常常需要实时追踪显示中的物体。

1 - 先看一个简单的示例

我们以矩形区域追踪为例,与前面文章介绍的静态分析类似,运动追踪实现的核心点也只有三个:

1. 请求操作句柄。

2. 构建请求。

3. 处理分析请求的回调。

首先我们先来构建操作句柄:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lazy var handler = VNSequenceRequestHandler()

构建请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lazy var request: VNTrackRectangleRequest = {    
    let req = VNTrackRectangleRequest(rectangleObservation: observation) { result, error in
        // 处理结果
        if let error {
            print(error)
        }
        // 处理结果
        self.handleResult(request: result as! VNTrackRectangleRequest)
    }
    // 选择快速模式
    req.trackingLevel = .fast
    return req
}()

在构建请求时,需要我们传入一个初始的描述矩形区域的VNRectangleObservation对象,之后的追踪会以参数为对象。VNRectangleObservation的构建示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 预检测得到的
var observation = VNRectangleObservation(boundingBox: CGRect(x: 0.3728713095188141, y: 0.833836019039154, width: 0.16493645310401917, height: 0.07572066783905029))

需要注意,这里的数据是我使用静态分析预先处理视频首帧得到的,实际应用中,我们也可以先对首帧进行静态分析,找到要追踪的矩形区域。

之外,我们还需要对视频资源进行一些处理,简单来说,即是解析视频帧,之后逐帧进行分析,示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func readVideo() {
    // 视频路径
    let videoURL = URL(fileURLWithPath: Bundle.main.path(forResource: "video1", ofType: ".mp4")!)
    // 读取视频资源
    let videoAsset = AVURLAsset(url: videoURL)
    // 创建视频资源解析器
    let videoProcessor = AVAssetImageGenerator(asset: videoAsset)
    videoProcessor.requestedTimeToleranceBefore = CMTime.zero
    videoProcessor.requestedTimeToleranceAfter = CMTime.zero
    // 获取视频时长
    let durationSeconds: Float64 = CMTimeGetSeconds(videoAsset.duration)
    // 存储要截取的视频帧时间点
    var times = [NSValue]()
    // 以每秒60帧为标准,获取总帧数
    let totalFrames: Float64 = durationSeconds * 60
    // 定义 CMTime 即请求缩略图的时间间隔
    for i in 0...Int(totalFrames) {
       let timeFrame = CMTimeMake(value: Int64(i), timescale: 60)
       let timeValue = NSValue(time: timeFrame)
       times.append(timeValue)
    }
    // 进行图片解析
    videoProcessor.generateCGImagesAsynchronously(forTimes: times) { time, cgImage, actualTime, resultCode, error  in
        if let cgImage = cgImage {
            let image = UIImage(cgImage: cgImage)
            self.images.append(image)
        }
    }
}

当所有视频帧处理完成后,我们即可以对其进行矩形追踪,示例方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func start() {
    var count = 0
    // 这里定时器的作用是逐帧的刷新页面,同时进行追踪
    Timer.scheduledTimer(withTimeInterval: 0.03, repeats: true) { t in
        if count < self.images.count {
            // 设置页面展示的图片
            self.imageView.image = self.images[count]
            // 将inputObservation设置为上一次的分析结果
            self.request.inputObservation = self.observation
            // 进行追踪分析
            try? self.handler.perform([self.request], on: self.images[count].cgImage!, orientation: .up)
            count += 1
        } else {
            // 当循环结束时,设置isLastFrame表情请求已经到了最后一帧
            self.request.isLastFrame = true
            // 停止定时器
            t.invalidate()
            print("end")
        }
    }
    print(images.count)
}

需要注意,追踪分析的本质是对矩形区域的前后状态进行比较,将其运行情况进行分析。因此,每次进行分析请求时需要将上一次的结果作为inputObservation进行输入,当视频结束时,设置起isLastFrame来结束分析,释放资源。

最后,分析结果的处理很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func handleResult(request: VNTrackRectangleRequest) {
    print(request.results)
    for r in request.results ?? [] {
        guard let result = r as? VNRectangleObservation else {
            return
        }
        observation = result
        var box = result.boundingBox
        // 坐标系转换
        box.origin.y = 1 - box.origin.y - box.size.height
        print("box:", result.boundingBox)
        DispatchQueue.main.async {
            let size = self.imageView.frame.size
            self.boxView.frame = CGRect(x: box.origin.x * size.width, y: box.origin.y * size.height, width: box.size.width * size.width, height: box.size.height * size.height)
        }
    }
}

其中,box是我们定义好的一个UIView蒙层,用来表示追踪的结果,效果如下GIF图所示:

其中,白色的色块是原始视频中的矩形物体,红色的色块是我们的追踪结果。

2 - 几个重要的类

VNSequenceRequestHandle类无需多说了,它的作用就是发起请求,其与VNImageRequestHandler类的最大区别在于VNSequenceRequestHandle在创建对象时无需设置一个图片资源,VNSequenceRequestHandle主要是用来分析一系列图片的,因此其是在请求执行时设置图片资源的。

VNTrackRectangleRequest类用来创建矩形区域追踪请求,继承自VNTrackingRequest类,VNTrackingRequest的定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
open class VNTrackingRequest : VNImageBasedRequest {
    // 输入追踪区域的Observation对象 每次根据中要刷新
    open var inputObservation: VNDetectedObjectObservation
    // 追踪模式
    open var trackingLevel: VNRequestTrackingLevel
    // 是否是最后一帧,如果设置为true,将停止后续分析
    open var isLastFrame: Bool
}

其中trackingLevel用了设置追踪的算法模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum VNRequestTrackingLevel : UInt, @unchecked Sendable {
    // 精准优先
    case accurate = 0
    // 速度优先
    case fast = 1
}

更多时候,我们要追踪的物体可能不是规则的矩形,也可能是会进行翻转和形变的物体,例如行驶中的汽车,飞行中的球类,奔跑中的人等。对于这类需求,我们需要使用VNTrackObjectRequest来进行追踪,其用法与VNTrackRectangleRequest几乎完全一致,这里就不再赘述,示例代码可以在下面找到:

https://github.com/ZYHshao/MachineLearnDemo

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS MachineLearning 系列(6)—— 视频中的物体轨迹分析
轨迹分析是比物体追踪更上层的一种应用。Vision框架中提供了检测视频中多个物体的运动轨迹等能力,在健身,体育类应用中非常有用。
珲少
2023/05/02
5680
iOS MachineLearning 系列(6)—— 视频中的物体轨迹分析
iOS MachineLearning 系列(2)—— 静态图像分析之矩形识别
本系列文章将完整的介绍iOS中Machine Learning相关技术的应用。本篇文章开始,我们将先介绍一些与Machine Learning相关的API的应用。使用这些API可以快速方便的实现很多如图像识别,分析等复杂功能,且不会增加应用安装包的体积。
珲少
2023/04/27
7550
iOS MachineLearning 系列(2)—— 静态图像分析之矩形识别
iOS MachineLearning 系列(9)—— 人物蒙版图生成
人物蒙版图能力是Vision框架在iOS 15中新增的功能,这个功能可以将图片中的人物按照轮廓生成无光蒙版。无光蒙版在实际业务中非常有用,使用此蒙版可以方便的将人物从图片中提取出来,然后和其他的背景图进行合成。
珲少
2023/05/02
5840
iOS MachineLearning 系列(9)—— 人物蒙版图生成
iOS MachineLearning 系列(3)—— 静态图像分析之区域识别
本系列的前一篇文章介绍了如何使用iOS中自带的API对图片中的矩形区域进行分析。在图像静态分析方面,矩形区域分析是非常基础的部分。API还提供了更多面向应用的分析能力,如文本区域分析,条形码二维码的分析,人脸区域分析,人体分析等。本篇文章主要介绍这些分析API的应用。关于矩形识别的基础文章,链接如下:
珲少
2023/04/27
8730
iOS MachineLearning 系列(3)—— 静态图像分析之区域识别
AVFoundation框架解析看这里(7)- AVAssetImageGenerator
AVAssetImageGenerator,用来提供视频的缩略图或预览视频的帧的类。在很多视频软件中,基本都会提供跟随鼠标进度显示画面,裁剪视频时预览关键帧等功能,实际上,这种类似的功能都是AVAssetImageGenerator的功劳。
sweet说好的幸福
2020/12/23
1.3K0
Core ML简介及实时目标检测及Caffe TensorFlow coremltools模型转换
Core ML简介及实时目标检测,Caffe、Tensorflow与Core ML模型转换、Vision库的使用 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本篇文章首先会简要介绍iOS 11推出的Core ML机器学习框架,接着会以实际的已经训练好的Caffe、Tensorflow模型为例,讲解coremltools转换工具的使用,以及如何在iOS端运行相关模型。 当今是人工智能元年,随着深度学习的火热,人工智能又一次出现在大众视野中,
WWWWDotPNG
2018/04/10
3.2K0
Core ML简介及实时目标检测及Caffe TensorFlow coremltools模型转换
iOS MachineLearning 系列(7)—— 图片相似度分析
图片相似度分析是Vision框架中提供的高级功能。其本质是计算图片的特征值,通过特征值的比较来计算出图片特征差距,从而可以获取到图片的相似程度。在实际应用中,图片的相似度分析有着广泛的应用。如人脸对比识别,相似物品的搜索和识别等。
珲少
2023/05/02
1.3K0
iOS MachineLearning 系列(7)—— 图片相似度分析
iOS ARKit教程:赤手在空中绘画
这次推荐的是ios上的文章,无奈ios上的东西没接触过,权且当做开拓视野了。老规矩,原文如下:
WindCoder
2018/09/19
1.9K0
iOS ARKit教程:赤手在空中绘画
讲解 Vision 图像识别框架 API详解
本篇文章主要简单介绍下其中的 Vision API 的使用(Vision更强大的地方是可以结合Core ML模型实现更强大的功能,本篇文章就不详细展开了) Vison 与 Core ML 的关系 Vi
IT派
2018/03/28
3.1K0
讲解 Vision 图像识别框架 API详解
初试 iOS 11 新框架:Vision Framework 让文字检测变得更容易
在 2017 年的 WWDC 中,Apple 释出了许多新框架(frameworks),Vision Framework 便是其中一个。使用 Vision Framework ,你不需要高深的知识就可以很容易地在你的 App 中实作出电脑视觉技术(Vision Techniques)!Vision Framework 可以让你的 App 执行许多强大的功能,例如识别人脸范围及脸部特徵(微笑、皱眉、左眼眉毛等等)、条码检测、分类出图像中的场景、物件检测及追踪以及视距检测。 或许那些已经使用 Swift 开发程
iOSDevLog
2018/06/21
2.6K0
iOS 11: CORE ML—浅析
导语:在刚刚过去的WWDC上,苹果发布了Core ML这个机器学习框架。现在,开发者可以轻松的使用Core ML把机器学习功能集成到自己的应用里,让应用变得更加智能,给用户更牛逼的体验。 苹果在 iOS 5 里引入了 NSLinguisticTagger 来分析自然语言。iOS 8 出了 Metal,提供了对设备 GPU 的底层访问。去年,苹果在 Accelerate 框架添加了 Basic Neural Network Subroutines (BNNS),使开发者可以构建用于推理(不是训练)的神经网络。
腾讯Bugly
2018/03/23
1.7K0
用MATLAB实现对运动物体识别与跟踪
不得不说MATLAB的图像处理函数有点多,但速度有时也是出奇的慢。还是想c的指针,虽然有点危险,但速度那是杠杠的。 第二个MATLAB程序,对运动物体的识别与追踪。 这里我们主要运用帧差法实现运动物体与背景图像的分离,由于视频中的物体较为简单,我们只对两帧图像取帧差(也是为了提高速度) 对于运动物体的提取我们运用了MATLAB里自带的函数bwareaopen bwareaopen(src,int),src为二值图像,int为设置的联通域的大小,是对帧差法,在转化为二值的图像进行操作,结果是将大小小于设定的int的连通域置为0; 对于第一帧与第二帧图像运动物体的坐标的提取我们用了自带的regionprops函数 regionprops(src,’‘)其中src为传入的二值图像,’‘内的为你所需要的属性 具体属性可以查看MATLAB的help
全栈程序员站长
2022/07/19
7200
用MATLAB实现对运动物体识别与跟踪
iOS 视频播放方式整理
初衷 ----       多媒体这整个系列的文章自己也准备好开始整理了,先从视频音频最简单也是最常用的播放出发慢慢的往下深究,探索到底层的编码解码等等,这篇文章就从视频的播放这个最简单的说起。       iOS的视频播放方式有几种?其实要是只是简单的想播放一段视频并且对UI没什么要求的话的确比较简单,很容易搞定,但我相信这种情况除了你的Demo一般是不会出现的,对播放UI的定义以及可能有各种不同的需求对应着你是不能随便写个播放器就没事了的。 最原始的播放 ----       要不是刚接触iOS开发的同
Mr.RisingSun
2018/02/06
2.8K0
iOS 视频播放方式整理
Core ML and Vision Framework on iOS 11
本文介绍了 Vision 在 iOS 平台上的新框架,以及如何使用 VisionKit 与 Core ML 在 iOS 平台上进行模型推理。作者还介绍了 Vision 在 iOS 平台上的新框架,包括 VisionKit 和 Core ML,并展示了如何使用这些框架进行模型推理。此外,作者还探讨了 Vision 与 Core ML 的关系,以及如何在 iOS 平台上使用 Vision 进行图片分类、物体检测、人脸识别、文本检测等任务。
MelonTeam
2018/01/04
1.5K0
Core ML and Vision Framework on iOS 11
系列 | OpenVINO视觉加速库使用五
OpenVINO中的推断引擎(Inference Engine-IE)在加载网络权重与配置文件,生成一个可执行网络以后,通过下面两个API可以获取InferRequest对象
OpenCV学堂
2019/04/29
2.2K0
系列 | OpenVINO视觉加速库使用五
iOS 页面渲染 - UIView & CALayer
今天我们来聊一聊 UIView 与 CALayer 的相关知识以及它们之间的关系,其实这部分内容要是引申出来会比较多,今天我们先收敛一下,先讲一些基本的东西,后面还会有系列文章对其进行扩展。关于iOS的UI渲染部分,还是建议大家看看Apple的官方文档核心动画编程指南[1]以及WWDC2011的sessionUnderstanding UIKit Rendering[2]。
CoderStar
2022/08/24
2K2
iOS 页面渲染 - UIView & CALayer
用苹果官方 API 实现 iOS 备忘录的扫描文稿功能
iOS 系统自带的备忘录(Notes)在其质朴名称下提供了众多强大的功能,扫描文稿是我使用较多的功能之一。很早前便想在【健康笔记[2]】之中提供类似的功能,但考虑到其涉及的知识点较多,迟迟没有下手。最近在空闲时,将近年 WWDC 中涉及该功能实现的专题梳理、学习了一遍,受益匪浅。苹果官方早已为我们准备了所需的一切工具。本文将介绍如何通过 VisionKit、Vision、NaturalLanguage、CoreSpotlight 等系统框架实现与备忘录扫描文稿类似的功能。
东坡肘子
2022/07/28
1.5K0
用苹果官方 API 实现 iOS 备忘录的扫描文稿功能
【IOS开发高级系列】异步绘制专题
用CGImageCreateCopy 或者CGImageCreateCopyWithColorSpace函数拷贝
江中散人_Jun
2022/03/08
1.5K0
【IOS开发高级系列】异步绘制专题
iOS MachineLearning 系列(20)—— 训练生成CoreML模型
本系列前面的文章详细的介绍了在iOS中与AI能力相关的API的使用,也介绍了如何使用训练好的CoreML模型来实现更强大的AI能力。然而,无论是成熟的API提供的能力,还是各种各样的三方模型,有时候都并不能满足某一领域内的定制化需求。当我们拥有很多的课训练数据,且需要定制化的AI能力时,其实就可以自己训练生成CoreML模型,将此定制化的模型应用到工程中去。
珲少
2023/05/29
8250
iOS MachineLearning 系列(20)—— 训练生成CoreML模型
opencv︱图片与视频的读入、显示、写出、放缩与基本绘图函数介绍
opencv中读入、显示、写出图片:cv2.imread(), cv2.imshow(), cv2.imwrite()
悟乙己
2019/05/26
5.8K0
推荐阅读
相关推荐
iOS MachineLearning 系列(6)—— 视频中的物体轨迹分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验