Улучшить результаты оптического распознавания изображений?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Улучшить результаты оптического распознавания изображений?

Сообщение Anonymous »

Я просто пытаюсь отсканировать информацию о кредитной карте с помощью зрения и получаю неоднозначные результаты. Карты без тиснения (которые сегодня кажутся более распространенными) с белым или светлым текстом вызывают больше всего проблем. Темный текст работает в основном нормально. Я чувствую, что могут возникнуть проблемы с ограниченным контрастом между буквами и фоном (серебряная карточка, белый текст). До сих пор я пытался изменить изображение на оттенки серого перед сканированием, а также увеличить контрастность и резкость, но это ухудшало результаты, когда текст не мог распознаваться. Что я могу сделать, чтобы улучшить свой код и получить лучшие результаты?
// MARK: Credit Card Image Recognition
open func detectRectangle(in image: CVPixelBuffer) {
let request = VNDetectRectanglesRequest(completionHandler: { (request, error) in
DispatchQueue.main.async {
guard let results = request.results as? [VNRectangleObservation], let result = results.first else { return }
self.doPerspectiveCorrection(result, from: image)
}
})

request.minimumAspectRatio = VNAspectRatio(1.3)
request.maximumAspectRatio = VNAspectRatio(1.3)
request.minimumSize = Float(0.5)
request.maximumObservations = 1

let imageHandler = VNImageRequestHandler(cvPixelBuffer: image, options: [:])
try? imageHandler.perform([request])
}

open func doPerspectiveCorrection(_ observation: VNRectangleObservation, from buffer: CVImageBuffer) {
var ciImage = CIImage(cvImageBuffer: buffer)

ciImage.cropped(to: holedOutRect)

let topLeft = observation.topLeft.scaled(to: ciImage.extent.size)
let topRight = observation.topRight.scaled(to: ciImage.extent.size)
let bottomLeft = observation.bottomLeft.scaled(to: ciImage.extent.size)
let bottomRight = observation.bottomRight.scaled(to: ciImage.extent.size)

ciImage = ciImage.applyingFilter("CIPerspectiveCorrection", parameters: [
"inputTopLeft": CIVector(cgPoint: topLeft),
"inputTopRight": CIVector(cgPoint: topRight),
"inputBottomLeft": CIVector(cgPoint: bottomLeft),
"inputBottomRight": CIVector(cgPoint: bottomRight),
])

let context = CIContext()
let cgImage = context.createCGImage(ciImage, from: ciImage.extent)
let output = UIImage(cgImage: cgImage!)

recognizeTextInImage(output)
}

open func recognizeTextInImage(_ image: UIImage) {
guard let cgImage = image.cgImage else { return }

textRecognitionWorkQueue.async {
guard !self.captured else { return }
let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
do {
guard let textRecognitionRequest = self.textRecognitionRequest else { return }
try requestHandler.perform([textRecognitionRequest])
} catch {
print(error)
}
}
}

open func setupVision() {
textRecognitionRequest = VNRecognizeTextRequest { (request, error) in
guard !self.captured, let observations = request.results as? [VNRecognizedTextObservation] else { return }

let creditCard = CardModel()

for observation in observations {
guard let topCandidate = observation.topCandidates(1).first, topCandidate.confidence > 0.25 else { return }

let topCandidateString = topCandidate.string

if topCandidateString.isName {
creditCard.name = topCandidateString
}

if topCandidateString.isCardNumber {
creditCard.number = topCandidateString.onlyDigits
}

if topCandidateString.isExpirationDate {
creditCard.month = topCandidateString.expirationMonth
creditCard.year = topCandidateString.expirationYear
}
}

DispatchQueue.main.async {
guard let _ = creditCard.number else { return }
// Credit card number have been found, stop the camera capture session
self.hapticScanSuccessResponse()
self.showScannedCardDetails(name: creditCard.name, cardNumber: creditCard.number, expiryMonth: creditCard.month, expiryYear: creditCard.year)

DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
// Send it back to the calling protocol/delegate
guard !self.captured else { return }
self.captured = true
self.captureSession.stopRunning()

if self.embeddedAsView {
self.delegate?.didFinishScanningCreditCard?(cardModel: creditCard)
self.onDismissal?(creditCard)
} else {
self.dismiss(animated: true) {
self.delegate?.didFinishScanningCreditCard?(cardModel: creditCard)
}
}

})
}
}

textRecognitionRequest?.recognitionLevel = .accurate
}
}

// MARK: AVCaptureVideoDataOutputSampleBufferDelegate
extension PaymentScannerViewController: AVCaptureVideoDataOutputSampleBufferDelegate {

// AVCaptureVideoDataOutputSampleBufferDelegate -
open func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
return
}

let ciImage = CIImage(cvPixelBuffer: imageBuffer)
guard let image = ciImage.convertToUIImage() else { return }

imageCounter += 1

// Reduces the amount of images processed to every 25th image in order to not reach max cpu usage
guard !captured && imageCounter.isMultiple(of: 25) else { return }
detectRectangle(in: imageBuffer)
}
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... cr-results
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»