将图像叠加到CGRect swift

时间:2018-09-04 03:16:53

标签: ios swift computer-vision ios11 cgrect

我正在使用Apple提供的以下示例应用程序来进行一些对象检测。

https://developer.apple.com/documentation/vision/tracking_multiple_objects_or_rectangles_in_video

我正在尝试在视频中绿色矩形上方粘贴一张脸部图像。 (视频下载链接:https://drive.google.com/file/d/1aw5L-6uBMTxeuq378Y98dZcTh6N_Y2Pf/view?usp=sharing

到目前为止,我能够非常一致地从视频中检测出绿色矩形,但是每当我尝试覆盖图像时,该帧就不会出现在视图中。

这是我到目前为止尝试过的:

TrackingImageView.swift中,我添加了一个名为faceImage的实例变量,并尝试通过在draw函数底部添加以下代码来将其添加到屏幕上。

UIGraphicsBeginImageContextWithOptions(self.imageAreaRect.size, false, 0.0)

//        self.faceImage.draw(in: CGRect(origin: CGPoint.init(x: rect.minX, y: rect.minY), size: rect.size))
self.faceImage.draw(in: CGRect(x: previous.x, y: previous.y, width: polyRect.boundingBox.width, height: polyRect.boundingBox.height))
//        self.faceImage.draw(in: rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

self.image = newImage

然后在TrackingViewController的{​​{1}}函数中,添加了以下几行。

func displayFrame(_ frame: CVPixelBuffer?, withAffineTransform transform: CGAffineTransform, rects: [TrackedPolyRect]?)

更新,这是我尝试过的另一种方法:

这就是文档中所说的:self.trackingView.faceImage = UIImage(named: "dwight1") self.trackingView.displayImage(rect: self.trackingView.polyRects[0].boundingBox)

因此,在Use the observation’s boundingBox to determine its location, so you can update your app or UI with the tracked object’s new location. Also use it to seed the next round of tracking.中的函数func performTracking(type: TrackedObjectType)中,我添加了以下内容:

VisionTrackerProcessor

delegate?.updateImage(observation.boundingBox) 中,我添加了这个内容:

TrackingViewController

func updateImage(_ rect: CGRect) { print(rect) self.faceImage.frame = rect } 是这样:

faceImage

当我打印出要放置图像的矩形的CGPoints时,得到以下输出:

@IBOutlet weak var faceImage: UIImageView!

任何将图像叠加在检测到的物体上的帮助都会令人惊讶。谢谢!

1 个答案:

答案 0 :(得分:0)

您是否意识到从Vision框架获得的坐标是归一化的坐标(介于0和1之间)?您将必须对其进行转换以适合视图的大小。

此外,据我所知,视觉坐标是从左下角开始的(与UIKit相反,是从左上角开始的),因此您可能还必须垂直翻转它们(此处不是100%确定)

编辑: 我看到您有可用的videoReader.affineTransform,可以尝试使用该转换来修改CGRect。