我正在使用Vision框架来处理图片。我正在使用的函数运行良好,并且在完成处理程序中不返回任何错误但结果为空。
这是我的功能:
func recognizeImage() {
let request = VNDetectFaceRectanglesRequest { (res: VNRequest, error: Error?) in
print("Reuslt : \(res.accessibilityActivationPoint)")
}
if let cgContet = image.image.cgImage {
let handler = VNImageRequestHandler(cgImage: cgContet)
try? handler.perform([request])
}
}
该功能的结果是:
Reuslt : (0.0, 0.0)
答案 0 :(得分:4)
这里的信息不足以确定,但可能......
人脸识别需要知道图像方向。 (因为只有在你正在寻找正面朝上的面孔时,才能准确地确定哪些像素斑点不是面部是一件容易的事。)
CGImage
不知道它自己的方向,因此您必须单独获取该信息并将其传递给其中一个VNImageRequestHandler
初始值设定项that takes an orientation。
这些初始值设定项采用EXIF方向值(又名CGImagePropertyOrientation
)。如果您从UIImage
开始,则枚举的基础数值与UIImageOrientation
的数值不匹配,因此您需要转换它们。在sample code attached to the Vision session from WWDC17中有一种方便的方法。
答案 1 :(得分:3)
如果要检测面部并在每个面上绘制一个矩形,请尝试以下方法:
let request=VNDetectFaceRectanglesRequest{request, error in
var final_image=UIImage(named: image_to_process)
if let results=request.results as? [VNFaceObservation]{
print(results.count, "faces found")
for face_obs in results{
//draw original image
UIGraphicsBeginImageContextWithOptions(final_image.size, false, 1.0)
final_image.draw(in: CGRect(x: 0, y: 0, width: final_image.size.width, height: final_image.size.height))
//get face rect
var rect=face_obs.boundingBox
let tf=CGAffineTransform.init(scaleX: 1, y: -1).translatedBy(x: 0, y: -final_image.size.height)
let ts=CGAffineTransform.identity.scaledBy(x: final_image.size.width, y: final_image.size.height)
let converted_rect=rect.applying(ts).applying(tf)
//draw face rect on image
let c=UIGraphicsGetCurrentContext()!
c.setStrokeColor(UIColor.red.cgColor)
c.setLineWidth(0.01*final_image.size.width)
c.stroke(converted_rect)
//get result image
let result=UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
final_image=result!
}
}
//display final image
DispatchQueue.main.async{
self.image_view.image=final_image
}
}
guard let ciimage=CIImage(image:image_to_process) else{
fatalError("couldn't convert uiimage to ciimage")
}
let handler=VNImageRequestHandler(ciImage: ciimage)
DispatchQueue.global(qos: .userInteractive).async{
do{
try handler.perform([request])
}catch{
print(error)
}
}
答案 2 :(得分:2)
这个问题让我也疯了。事实证明,原始问题是图像的方向,cgiImage或ciiImage都无法正确处理。我从某处复制的一些代码通过简单的转换将错误的方向从图像转换为cgi(它们的顺序不同)。
我创建了一个方向转换器,下面的代码对我有用:
let handler = VNImageRequestHandler(cgImage: image.cgImage!, orientation: self.convertImageOrientation(orientation: image.imageOrientation))
...
func convertImageOrientation(orientation: UIImageOrientation) -> CGImagePropertyOrientation {
let cgiOrientations : [ CGImagePropertyOrientation ] = [
.up, .down, .left, .right, .upMirrored, .downMirrored, .leftMirrored, .rightMirrored
]
return cgiOrientations[orientation.rawValue]
}