【问题标题】:Get selected image in imagePickerController and pass it to coreML在 imagePickerController 中获取选定的图像并将其传递给 coreML
【发布时间】:2019-08-11 15:14:41
【问题描述】:

我正在尝试使用 coreML 进行识别,该功能正常工作并正确显示结果。但是我想将该方法调用为一个按钮,就像我按下 catDog 按钮并运行该方法一样。但是由于 finalResult() 和 identifyCatOrDog() 是它自己的函数,所以我不能将它调用到按钮中。我试图将方法复制并粘贴到按钮内,但它没有显示任何内容。如何编辑代码,以便 findResult() 仅在我按下按钮时才起作用,而不是自动运行?

import UIKit
import CoreML
import Vision
import Photos

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet var loadImage: UIImageView!
@IBOutlet var Result: UILabel!

@IBAction func photoBtn(_ sender: UIButton) {
    getPhoto()
}

@IBAction func cameraBtn(_ sender: UIButton) {
}

@IBAction func catDog(_ sender: UIButton) {
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func getPhoto() {
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.sourceType = .photoLibrary
    present(picker, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    picker.dismiss(animated: true, completion: nil)
    guard let gotImage = info[.originalImage] as? UIImage else {
        fatalError("No picture chosen")
    }

    loadImage.image = gotImage
    identifyCatOrDog(image: gotImage)
}

func identifyCatOrDog(image: UIImage) {
    let modelFile = ImageClassifier()
    let model = try! VNCoreMLModel(for: modelFile.model)

    let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [ : ])

    let request = VNCoreMLRequest(model: model, completionHandler: findResults)
    try! handler.perform([request])
}

func findResults(request: VNRequest, error: Error?) {
    guard let results = request.results as? [VNClassificationObservation] else {
        fatalError("Unable to get results")
    }

    var bestGuess = ""
    var bestConfidence: VNConfidence = 0

    for classification in results {
        if (classification.confidence > bestConfidence) {
            bestConfidence = classification.confidence
            bestGuess = classification.identifier
        }
    }

    Result.text = "Image is: \(bestGuess) with confidence \(bestConfidence) out of 1"
}

【问题讨论】:

    标签: swift uiimagepickercontroller coreml


    【解决方案1】:

    我认为问题在于,有时当图像选择器被关闭时,您想调用 identifyCatOrDog,但其他时候却不想。

    一个相当粗略的可能性是:在按钮操作方法中,提高一个布尔实例属性标志,以便在调用didFinishPickingMedia 时知道是否调用identifyCatOrDog

    更复杂的方法是将事物划分为辅助类,以便在按下catDog 按钮后图像选择器的操作发生在完全不同的代码世界中。

    【讨论】:

    • 我尝试使用 UIswitch 来解决这个问题,我添加了这些代码链接: if (catDogSwitch.isOn) { identifyCatOrDog(image: gotImage) } else if (faceSwitch.isOn){ identifyFacesWithLandmarks(image : 得到图像) }
    猜你喜欢
    • 2021-03-22
    • 1970-01-01
    • 2016-06-22
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多