Zba*_*itZ 0 core-graphics ios swift apple-vision
作为参考,这源于Vision API中的一个问题。我正在努力使用Vision通过 a 来检测图像中的面部VNDetectFaceRectanglesRequest,该方法在确定图像中正确的面部数量并boundingBox为每张面部提供 方面成功发挥作用。
我的麻烦是,由于我UIImageView(持有有UIImage问题的)正在使用.scaleAspectFit内容模式,我在纵向模式下正确绘制边界框(在横向模式下效果很好)方面遇到了巨大的困难。
这是我的代码;
func detectFaces(image: UIImage) {
let detectFaceRequest = VNDetectFaceRectanglesRequest { (request, error) in
if let results = request.results as? [VNFaceObservation] {
for faceObservation in results {
let boundingRect = faceObservation.boundingBox
let transform = CGAffineTransform(scaleX: 1, y: -1).translatedBy(x: 0, y: -self.mainImageView.frame.size.height)
let translate = CGAffineTransform.identity.scaledBy(x: self.mainImageView.frame.size.width, y: self.mainImageView.frame.size.height)
let facebounds = boundingRect.applying(translate).applying(transform)
let mask = CAShapeLayer()
var maskLayer = [CAShapeLayer]()
mask.frame = facebounds
mask.backgroundColor = UIColor.yellow.cgColor
mask.cornerRadius = 10
mask.opacity = 0.3
mask.borderColor = UIColor.yellow.cgColor
mask.borderWidth = 2.0
maskLayer.append(mask)
self.mainImageView.layer.insertSublayer(mask, at: 1)
}
}
let vnImage = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
try? vnImage.perform([detectFaceRequest])
}
Run Code Online (Sandbox Code Playgroud)
这是我所看到的最终结果,请注意,在纵向时,这些框的X位置是正确的,但Y位置很大程度上不准确。
VNFaceObservation边界框被标准化为处理后的图像。来自文档。
检测到的对象的边界框。坐标被标准化为处理图像的尺寸,原点位于图像的左下角。
因此,您可以使用简单的计算来找到检测到的脸部的正确尺寸/框架,如下所示。
let boundingBox = observation.boundingBox
let size = CGSize(width: boundingBox.width * imageView.bounds.width,
height: boundingBox.height * imageView.bounds.height)
let origin = CGPoint(x: boundingBox.minX * imageView.bounds.width,
y: (1 - observation.boundingBox.minY) * imageView.bounds.height - size.height)
Run Code Online (Sandbox Code Playgroud)
然后你可以形成CAShapeLayer如下所示的矩形
layer.frame = CGRect(origin: origin, size: size)
| 归档时间: |
|
| 查看次数: |
2997 次 |
| 最近记录: |