Я просто пытаюсь отсканировать информацию о кредитной карте с помощью зрения и получаю неоднозначные результаты. Карты без тиснения (которые сегодня кажутся более распространенными) с белым или светлым текстом вызывают больше всего проблем. Темный текст работает в основном нормально. Я чувствую, что могут возникнуть проблемы с ограниченным контрастом между буквами и фоном (серебряная карточка, белый текст). До сих пор я пытался изменить изображение на оттенки серого перед сканированием, а также увеличить контрастность и резкость, но это ухудшало результаты, когда текст не мог распознаваться. Что я могу сделать, чтобы улучшить свой код и получить лучшие результаты?
// 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
Улучшить результаты оптического распознавания изображений? ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Предварительная обработка изображений для оптического распознавания символов (pytesseract)
Anonymous » » в форуме Python - 0 Ответы
- 119 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Предварительная обработка изображений в Python для оптического распознавания символов
Anonymous » » в форуме Python - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Предварительная обработка изображений в Python для оптического распознавания символов
Anonymous » » в форуме Python - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-