【发布时间】:2019-03-10 07:57:38
【问题描述】:
我正在尝试获取图像中人脸的边界框值并裁剪边界框中的人脸。我能够成功获取并绘制边界框,但无法裁剪图像并在图像视图中显示它们。谁能指导我哪里出错了?谢谢。
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)")
}
}
}
【问题讨论】:
-
"无法裁剪图像" 您是什么意思“无法”?实际发生了什么?您的代码遇到了什么问题?
-
嗨@matt,说无法裁剪图像,我的意思是运行这段代码,我可以在图像视图中看到带有红色边界框的原始图像。但是当我添加代码以将边界框中的人脸裁剪为图像并将其显示在 ImageView 中时,我得到一个空屏幕。我检查了裁剪图像的大小,看起来也很好。我认为这是一个小问题,但在哪里。我对 iOS 开发有点陌生,所以试图找出问题所在。
-
裁剪后的图片的size可能没问题,但content可能不行。为什么不调试?在
self.view.addSubview(cropImageView)上放置一个断点并在调试器中暂停时查看查看图像和图像视图。然后继续并使用视图调试器查看您的图像视图发生了什么。