0

参考までに、これは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位置はほとんど不正確であることに注意してください。

** 縦向きの不適切な配置** 縦向きの不適切な配置

** 横向きでの正しい配置** ランドスケープでの正しい配置

4

2 に答える 2