Подтвердить что ты не робот

IOS: OCR в режиме реального времени в верхней части живого видеопотока (похоже на подарочную карту iTunes Redeem)

Есть ли способ сделать что-то похожее на то, что делают приложения iTunes и App Store, когда вы выкупаете подарочную карту с помощью камеры устройства, распознавая короткую строку символов в реальном времени на верхней части канала прямой передачи?

iTunes App Redeem Gift Card UI

Я знаю, что в iOS 7 теперь есть класс AVMetadataMachineReadableCodeObject, который AFAIK представляет только штрих-коды. Меня больше интересует обнаружение и чтение содержимого короткой строки. Возможно ли это, используя общедоступные методы API или какой-либо другой сторонний SDK, о котором вы знаете?

Существует также видео процесса в действии:

https://www.youtube.com/watch?v=c7swRRLlYEo

Бест,

4b9b3361

Ответ 1

Я работаю над проектом, который делает что-то похожее на Apple App Store с помощью камеры, как вы упомянули.

Отличное место для обработки видео в реальном времени - проект, который я нашел на GitHub. Это использует структуру AVFoundation, и вы реализуете методы AVCaptureVideoDataOutputSampleBufferDelegate.

Как только у вас есть поток изображений (видео), вы можете использовать OpenCV для обработки видео. Вам необходимо определить область на изображении, которое вы хотите использовать OCR, прежде чем запускать его через Tesseract. Вы должны играть с фильтрацией, но широкие шаги, которые вы выполняете с OpenCV:

  • Преобразование изображений в B & W с использованием cv:: cvtColor (inputMat, outputMat, CV_RGBA2GRAY);
  • Порог изображений для устранения ненужных элементов. Вы указываете пороговое значение для устранения, а затем установите все остальное на черный (или белый).
  • Определите линии, которые образуют границу поля (или независимо от того, что вы обрабатываете). Вы можете создать "ограничительную рамку", если вы устранили все, кроме нужной области, или используйте алгоритм HoughLines (или вероятностную версию HoughLinesP). Используя это, вы можете определить пересечение линии, чтобы найти углы, и использовать углы для деформации нужной области, чтобы выровнять ее в правильный прямоугольник (если этот шаг необходим в вашем приложении) до OCR.
  • Обработать часть изображения с помощью библиотеки OCR Tesseract, чтобы получить полученный текст. В OpenCV можно создавать учебные файлы для букв, чтобы вы могли читать текст без Tesseract. Это может быть быстрее, но также может быть намного больше. В приложении App Store они делают что-то похожее, чтобы отобразить текст, который был прочитан поверх верхнего изображения. Это добавляет прохладный фактор, поэтому он просто зависит от того, что вам нужно.

Некоторые другие подсказки:

  • Я использовал книгу "Instant OpenCV", чтобы быстро начать с этого. Это было очень полезно.
  • Загрузите OpenCV для iOS из OpenCV.org/downloads.html
  • Я нашел адаптивное пороговое значение очень полезным, вы можете прочитать все об этом, выполнив поиск "OpenCV adaptiveThreshold". Кроме того, если у вас есть изображение с очень маленьким промежутком между светлыми и темными элементами, вы можете использовать Binarization Otsu. Это автоматически определяет пороговые значения на основе гистограммы изображения в градациях серого.

Ответ 2

"Реальное время" - это всего лишь набор изображений. Вам даже не нужно думать о том, чтобы обрабатывать все из них, достаточно, чтобы широко представить движение устройства (или изменение положения камеры). В iOS SDK нет ничего, чтобы делать то, что вы хотите, но вы можете использовать стороннюю библиотеку OCR (например, Tesseract) для обработки изображений, которые вы захватываете с камеры.

Ответ 3

Я бы посмотрел на Tesseract. Это библиотека OCR с открытым исходным кодом, которая принимает данные изображения и обрабатывает его. Вы можете добавлять различные регулярные выражения и искать только определенные символы. Это не идеально, но по моему опыту он работает очень хорошо. Кроме того, он может быть установлен как CocoaPod, если вы занимаетесь этим.

Если вы хотите зафиксировать это в режиме реального времени, вы можете использовать GPUImage, чтобы поймать изображения в реальном времени и обработать на входящие изображения, чтобы ускорить Tesseract, используя различные фильтры или уменьшая размер или качество входящих изображений.