0
비전을 사용하여 텍스트를 감지하지만 모든 화면에서 감지되는 것을 볼 수 있습니다. 특정 영역 (예 : 사각형)에서만 감지 할 수있는 방법이 있습니다. 나는 스크린의 한가운데에 그렸다.비전, iOS, 스위프트가있는 전체 화면이 아닌 사각형으로 텍스트를 감지
그래서 전체 화면이 카메라이지만 텍스트가 가운데에 사각형을 입력하면 주위에 상자가 그려집니다.
다음은 내 텍스트의 코드를 감지하고 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)
}