2017-09-04 14 views
0

비전을 사용하여 텍스트를 감지하지만 모든 화면에서 감지되는 것을 볼 수 있습니다. 특정 영역 (예 : 사각형)에서만 감지 할 수있는 방법이 있습니다. 나는 스크린의 한가운데에 그렸다.비전, iOS, 스위프트가있는 전체 화면이 아닌 사각형으로 텍스트를 감지

그래서 전체 화면이 카메라이지만 텍스트가 가운데에 사각형을 입력하면 주위에 상자가 그려집니다.

Photo of how I want it

다음은 내 텍스트의 코드를 감지하고 cameraPreviewLayer입니다.

가능한 경우 2 개의 카메라 미리보기 레이어가 필요합니까?

func setupPreviewLayer() { 
    cameraPreviewlayer = AVCaptureVideoPreviewLayer(session: captureSession) 
    cameraPreviewlayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill 
    cameraPreviewlayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait 
    cameraPreviewlayer?.frame = self.view.frame 
    self.view.layer.insertSublayer(cameraPreviewlayer!, at: 0) 
} 

func startTextDetection() { 
    let textRequest = VNDetectTextRectanglesRequest(completionHandler: self.detectTextHandler) 
    textRequest.reportCharacterBoxes = true 
    self.requests = [textRequest] 
} 

func detectTextHandler(request: VNRequest, error: Error?) { 
    guard let observations = request.results else { 
     print("no result") 
     return 
    } 

    let result = observations.map({$0 as? VNTextObservation}) 

    DispatchQueue.main.async() { 
     self.cameraPreviewlayer?.sublayers?.removeSubrange(1...) 
     for region in result { 
      guard let rg = region else { 
       continue 
      } 

      self.highlightWord(box: rg) 

      if let boxes = region?.characterBoxes { 
       for characterBox in boxes { 
        self.highlightLetters(box: characterBox) 
       } 
      } 
     } 
    } 
} 

func highlightWord(box: VNTextObservation) { 
    guard let boxes = box.characterBoxes else { 
     return 
    } 

    var maxX: CGFloat = 9999.0 
    var minX: CGFloat = 0.0 
    var maxY: CGFloat = 9999.0 
    var minY: CGFloat = 0.0 

    for char in boxes { 
     if char.bottomLeft.x < maxX { 
      maxX = char.bottomLeft.x 
     } 
     if char.bottomRight.x > minX { 
      minX = char.bottomRight.x 
     } 
     if char.bottomRight.y < maxY { 
      maxY = char.bottomRight.y 
     } 
     if char.topRight.y > minY { 
      minY = char.topRight.y 
     } 
    } 

    let xCord = maxX * (cameraPreviewlayer?.frame.size.width)! 
    let yCord = (1 - minY) * (cameraPreviewlayer?.frame.size.height)! 
    let width = (minX - maxX) * (cameraPreviewlayer?.frame.size.width)! 
    let height = (minY - maxY) * (cameraPreviewlayer?.frame.size.height)! 

    let outline = CALayer() 
    outline.frame = CGRect(x: xCord, y: yCord, width: width, height: height) 
    outline.borderWidth = 2.0 
    outline.borderColor = UIColor.red.cgColor 

    cameraPreviewlayer?.addSublayer(outline) 
} 

func highlightLetters(box: VNRectangleObservation) { 
    let xCord = box.topLeft.x * (cameraPreviewlayer?.frame.size.width)! 
    let yCord = (1 - box.topLeft.y) * (cameraPreviewlayer?.frame.size.height)! 
    let width = (box.topRight.x - box.bottomLeft.x) * (cameraPreviewlayer?.frame.size.width)! 
    let height = (box.topLeft.y - box.bottomLeft.y) * (cameraPreviewlayer?.frame.size.height)! 

    let outline = CALayer() 
    outline.frame = CGRect(x: xCord, y: yCord, width: width, height: height) 
    outline.borderWidth = 1.0 
    outline.borderColor = UIColor.blue.cgColor 

    cameraPreviewlayer?.addSublayer(outline) 
} 

답변

0

나는 이것을 추가하여 알아 냈습니다.

let outline = CALayer() 
outline.frame = CGRect(x: xCord, y: yCord, width: width, height: height) 
outline.borderWidth = 1.0 
outline.borderColor = UIColor.blue.cgColor 

cameraPreviewlayer?.addSublayer(outline) 

전에

let wordRect = CGRect(x: xCord, y: yCord, width: width, height: height) 
    guard regionOfInterest.contains(wordRect.origin) else { return } // only draw a box if the orgin of the word box is within the regionOfInterest 

난 단지에있는 텍스트를 표시 싶었 UIView의 크기의 프레임에 단어 RECT를 설정에만 사각형 단어의 코드를 실행하는 것이이 방법 .