处理图像后出现错误。 iOS,Swift
问题描述:
当我尝试处理图像并发送到Swift OCR时,出现此错误。处理图像后出现错误。 iOS,Swift
NSAssert(widthOfImage > 0 && heightOfImage > 0, @"Passed image must not be empty - it should be at least 1px tall and wide");
如果我绕过把手矩形功能,只需要调用与第一图像迅速OCR功能拍摄它工作正常,但通过函数processImage来把图像后,上述错误崩溃。
这里是我的功能。
lazy var rectanglesRequest: VNDetectRectanglesRequest = {
print("Tony 1 Requested....")
return VNDetectRectanglesRequest(completionHandler: self.handleRectangles)
}()
@objc func processImage() {
finalImage = nil
// finalImage = main.correctedImageView.image
guard let uiImage = correctedImageView.image
else { fatalError("no image from image picker") }
guard let ciImage = CIImage(image: uiImage)
else { fatalError("can't create CIImage from UIImage") }
let orientation = CGImagePropertyOrientation(uiImage.imageOrientation)
inputImage = ciImage.oriented(forExifOrientation: Int32(orientation.rawValue))
// Show the image in the UI.
// imageView.image = uiImage
// Run the rectangle detector, which upon completion runs the ML classifier.
let handler = VNImageRequestHandler(ciImage: ciImage, orientation: CGImagePropertyOrientation(rawValue: UInt32(Int32(orientation.rawValue)))!)
DispatchQueue.global(qos: .userInteractive).async {
do {
try handler.perform([self.rectanglesRequest])
} catch {
print(error)
}
}
}
func handleRectangles(request: VNRequest, error: Error?) {
guard let observations = request.results as? [VNRectangleObservation]
else { fatalError("unexpected result type from VNDetectRectanglesRequest") }
guard let detectedRectangle = observations.first else {
// DispatchQueue.main.async {
// self.classificationLabel.text = "No rectangles detected."
// }
return
}
let imageSize = inputImage.extent.size
// Verify detected rectangle is valid.
let boundingBox = detectedRectangle.boundingBox.scaled(to: imageSize)
guard inputImage.extent.contains(boundingBox)
else { print("invalid detected rectangle"); return }
// Rectify the detected image and reduce it to inverted grayscale for applying model.
let topLeft = detectedRectangle.topLeft.scaled(to: imageSize)
let topRight = detectedRectangle.topRight.scaled(to: imageSize)
let bottomLeft = detectedRectangle.bottomLeft.scaled(to: imageSize)
let bottomRight = detectedRectangle.bottomRight.scaled(to: imageSize)
let correctedImage = inputImage
.cropped(to: boundingBox)
.applyingFilter("CIPerspectiveCorrection", parameters: [
"inputTopLeft": CIVector(cgPoint: topLeft),
"inputTopRight": CIVector(cgPoint: topRight),
"inputBottomLeft": CIVector(cgPoint: bottomLeft),
"inputBottomRight": CIVector(cgPoint: bottomRight)
])
// Show the pre-processed image
DispatchQueue.main.async {
print("Tony: 1 adding image")
self.finalImage = UIImage(ciImage: correctedImage)
self.FinalizedImage.image = self.finalImage
// }else {
// print("Tony: No corected image......")
if self.FinalizedImage.image != nil {
print("Tony: 2 Got here to OCR")
self.perform(#selector(self.startOCR), with: nil, afterDelay: 1.0)
}
}
}
这个OCR功能
@objc func startOCR() {
print("Tony: OCR called")
if self.FinalizedImage.image != nil {
swiftOCRInstance.recognize(FinalizedImage.image!) {recognizedString in
self.classificationLabel.text = recognizedString
print("Tony: \(recognizedString)")
}
}else {
print("Tony: No image here")
}
}
答
我能想出解决办法。我不得不将图像从ciImage转换为cgImage,然后返回到uiImage。因为ciImage只是过滤器在处理后会如何影响图像的数据,所以我需要先固化它。
一个ciImage VAR inputImage的或使输入图像=另一ciImage您使用
inputImage = correctedImage
// Show the pre-processed image
DispatchQueue.main.async {
print("Tony: 1 adding image")
let cgImage = self.context.createCGImage(self.inputImage, from: self.inputImage.extent)
self.finalImageView.image = UIImage(cgImage: cgImage!)
//Filter Logic
let currentFilter = CIFilter(name: "CISharpenLuminance")
currentFilter!.setValue(CIImage(image: UIImage(cgImage: cgImage!)), forKey: kCIInputImageKey)
let output = currentFilter!.outputImage
let cgimg = self.context.createCGImage(output!, from: output!.extent)
let processedImage = UIImage(cgImage: cgimg!)
self.finalImageView.image = processedImage
// Then start the OCR work using finalImageView.image as the input image of the OCR
你每解决这个,因为我得到一个类似的问题? – DaE
嗨DaE,我可以保存它,我忘了添加答案。因为ciImage只是数据告诉图像它想要的图像上的过滤器工作它没有实际固化到图像,所以我不得不做那首先。希望我添加的答案是有道理的... –
只要你将ciImage从过滤器制作成cgImage,然后在运行OCR之前回到uiImage,你应该没问题 –