2017-10-05 3 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() 
} 

나는 또한이있는 UIImage 아래 그림에서 주 스레드에서 사용되어야한다 말합니다 보라색 오류 ...

+0

'UIImageView'가 아니라 'UIImageView'가 주 스레드에서 사용되어야한다는 오류가 표시됩니다. –

답변

0

enter image description here 당신은 메인 스레드를 사용할 필요를 얻을 때마다 ' UIImageView 또는 다른 UIKit 클래스로 작업하십시오 (예 : 별도로 명시하지 않는 한 백그라운드 스레드에 UIImages를 구성 할 때).

GCD을 주 스레드에서 사용할 수 있습니다.

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

출처 : Apple Documentation

스레딩 고려 사항 : 응용 프로그램의 사용자 인터페이스 노는는 주 스레드에서 발생해야합니다. 따라서 응용 프로그램의 기본 스레드 에서 실행되는 코드에서 항상 UIView 클래스의 메서드 을 호출해야합니다. 이것이 정확히 필요하지 않은 유일한 시간은 이지만 뷰 객체 자체를 만들 때만 가능하지만 다른 모든 조작 이 주 스레드에서 발생해야합니다.

+0

함수에 디스패치 주 대기열을 추가 했으므로 자주색 ​​오류가 제거됩니다. 하지만 같은 실패 함수를 호출 할 때 여전히 실패합니다. NSAssert (widthOfImage> 0 && heightOfImage> 0, @ "전달 된 이미지는 비어서는 안됩니다. 높이가 1px 이상이어야합니다."); –