ios - 如何在 ImageView Swift 中显示裁剪后的图像

标签 ios swift vision

我正在尝试获取图像中面部的边界框值并裁剪边界框中的面部。我能够成功获取并绘制边界框,但无法裁剪图像并在 ImageView 中显示它们。谁能指导我哪里出错了?谢谢。

import UIKit
import Vision

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // 1. Load Default Image
        guard let image = UIImage(named: "anuj.jpeg") else {return}
        imageView.image = image
        imageView.contentMode = .scaleAspectFit
        self.detectFaces(img: image)
    }



    @IBAction func modeSwitch(_ sender: UISwitch) {
        if sender.isOn{
            print("Camera Mode ON !!")
        }
        else{
            print("Camera Mode OFF !!")
        }
    }


    // *******************************************************************
    // 2. Function to detect faces in Image and retrun Bounding Box Values
    // *******************************************************************
    func detectFaces(img: UIImage){
        // Get Image Scaled Height
        let imageScaledHeight = view.frame.width / (img.size.width) * (img.size.height)
        // Create Face Detection Request
        let request = VNDetectFaceRectanglesRequest { (req, err)
            in
            if let err = err{
                print("Failed to detect faces !! \(err)")
                return
            }
            print("Request: \(req)")

            req.results?.forEach({ (res) in
                // Get face observations
                guard let faceObservation = res as? VNFaceObservation else {return}

                // Print detected face bounding box values
                print("Face Observations: \(faceObservation.boundingBox)")

                // Create Bounding Box
                let x = self.view.frame.width * faceObservation.boundingBox.origin.x
                let width = self.view.frame.width * faceObservation.boundingBox.width
                let height = imageScaledHeight * faceObservation.boundingBox.height
                let y = imageScaledHeight * (1 - faceObservation.boundingBox.origin.y) - height

                // Show bounding Box
                let redView = UIView()
                redView.backgroundColor = .red
                redView.frame = CGRect(x: x, y: y, width: width, height: height)
                redView.alpha = 0.4
                self.view.addSubview(redView)

                // Crop Face in Red View i.e. in Bounding Box and show in Image View
                let crop = CGRect(x: x, y: y, width: width, height: height)
                let image = img.cgImage?.cropping(to: crop)
                let cropImageView = UIImageView(image: UIImage(cgImage: image!))
                self.view.addSubview(cropImageView)
            })
        }

        // Convert Image to cgImage and pass to request handler
        let cgImage = img.cgImage
        let handler = VNImageRequestHandler(cgImage: cgImage!, options: [:])
        // Perform vision request
        do{
            try handler.perform([request])
        }
        catch let reqErr{
            print("Failed to perform request: \(reqErr)")
        }
    }
}

最佳答案

问题可能出在这一行:

let image = img.cgImage?.cropping(to: crop)

不是如何裁剪 UIImage,因为 UIImage 以及屏幕上绘制的所有其他内容都有一个比例,并且它有一个方向,但 CGImage 没有。

要裁剪 UIImage,请将其绘制到适当缩放的图形图像上下文中,以便图像的所需区域落入上下文中,然后提取生成的图像。

关于ios - 如何在 ImageView Swift 中显示裁剪后的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52654951/

相关文章:

ios - 将字符串填充到 textView 时出现问题

swift - Firebase 上传图片

c++ - 使用 Raspberry Pi Camera 和 Open Cv 显示视频时出错

iphone - iPhone上的号码识别可以实时进行吗?

ios - 没有数据可用标签未显示在表格 View 中

ios - 如何用另一个 View 的内容遮盖一个 View 的图层?

ios - 在 Ipad 上运行应用程序时未加载库

iphone - 重新加载数据时 tableView 会崩溃

ios - 实现接收推送通知操作的委托(delegate)

python - 没有临时 img 的 Opencv cv2.absdiff(img1, img2).sum()