参考までに、これはVision APIの質問に由来します。私はVisionを使用して を介して画像内の顔を検出することに取り組んでいます。これは、画像内の正しい顔の数を決定し、各顔に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])
}
これは私が見ているものの最終結果です。ボックスのX位置は正しいですが、縦向きの場合のY位置はほとんど不正確であることに注意してください。