2017-10-05 11 views
0

別のものが終了したときに関数を呼び出そうとしていますが、画像が0ピクセル以上でないことを示すエラーが発生し続けるので、関数の前のイメージが呼び出されます。私がOCRを呼び出す関数のどこにブレークポイントを追加すると、アプリケーションはこの時点で画面上に画像を表示しないので、私はその結論に至りました。別の終了時に関数を実行する、iOS、Swift

ここはocrからのエラーです。

NSAssert(widthOfImage> 0 & & heightOfImage> 0、@ "合格画像は空であってはならない - それは、少なくとも1ピクセル身長と幅でなければなりません")。

以下は、私がフローを見るためにプリントを置いた私のコンソールです。

トニー要求1 .... トニー3ランOCR .... トニー2ハンドル長方形.... トニー:ここでCorected画像...... (lldb)

以下は私のコードです。私は完了する必要があります機能は、画像が配置されるまで呼び出されていないことを確認しますか?

func startOCR() { 
     swiftOCRInstance.recognize(correctedImageView.image!) {recognizedString in 
      print(recognizedString) 
      self.classificationLabel.text = recognizedString 
     } 
    } 


lazy var rectanglesRequest: VNDetectRectanglesRequest = { 
    print("Tony 1 Requested....") 
    return VNDetectRectanglesRequest(completionHandler: self.handleRectangles) 



}() 

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) 
      ]) 
    //   .applyingFilter("CIColorControls", parameters: [ 
    //    kCIInputSaturationKey: 0, 
    //    kCIInputContrastKey: 32 
    //   ]) 


    // Show the pre-processed image 
    DispatchQueue.main.async { 
     self.correctedImageView.image = UIImage(ciImage: correctedImage) 
     if self.correctedImageView.image != nil { 
      print("Tony 2 Handle Rectangle....") 
      print("Tony: Corected image here......") 

     }else { 
      print("Tony: No corected image......") 
     } 

    } 
    print("Tony 3 run OCR....") 
    self.startOCR() 
} 

私はまた、「あなたはいつでもあなたのメインスレッドを使用する必要が

enter image description here

+0

このエラーは、 'UIImage'ではなく、メインスレッドから' UIImageView'を使用するべきだと伝えています。 –

答えて

0

...インクルードはUIImageは以下のPICでメインスレッド上で使用すべきであると言う紫のエラーを取得しますUIImageView、または他のUIKitクラス(特に明記しない限り、バックグラウンドスレッドにUIImageを構築する場合など)を使用して作業してください。

GCDをメインスレッドで使用できます。

DispatchQueue.main.async { 
    //Handle UIKit actions here 
} 

出典:Apple Documentation

スレッドに関する注意事項:アプリケーションのユーザインタフェース に 操作は、メインスレッド上で発生しなければなりません。したがって、アプリケーションのメインスレッド で実行されているコードから、常に というUIViewクラスのメソッドを呼び出す必要があります。これは厳密に必要でない場合があります。 は、ビューオブジェクト自体を作成するときですが、他のすべての操作はメインスレッドで発生する必要があります。

+0

ディスパッチメインキューを関数に追加しました。これにより紫色のエラーが削除されます。同じ失敗を伴う関数を呼び出すときにはまだ失敗しています。 NSAssert(widthOfImage> 0 && heightOfImage> 0、@ "渡された画像は空であってはなりません - 少なくとも1pxの高さと幅でなければなりません"); –

関連する問題