OCR & OpenCV: разница между двумя кадрами на изображениях с высоким разрешением

Согласно этому сообщению OCR: Разница между двумя кадрами , теперь я знаю, как найти различия в пикселях между двумя изображениями с OpenCV.

Я хотел бы улучшить это решение и использовать его с изображениями высокого разрешения (из видео) с богатым контентом. Приведенный выше пример не применим к большим изображениям, потому что процесс замедляется (слишком много различий найдено, метод findCountours заполняет вкладку 250-килобайтными элементами, что требует огромного времени для обработки).

В моем приложении используется декодер RLE для декодирования сжатых кадров видео. Как только кадр декодируется, я хотел бы сравнить текущий кадр с предыдущим, чтобы сохранить различия между двумя кадрами на вкладке «Мат», например.

objective всего этого состоит в том, чтобы иметь возможность проводить анализ на разных пикселях и проверять наличие латинского символа. Это позволяет мне уменьшить количество пикселей для анализа и сэкономить драгоценное время.

Если у кого-то есть другие идеи вместо этого, чтобы выполнять такие операции, не стесняйтесь предлагать его, пожалуйста.

Спасибо за помощь.

EDIT 1: Пример двух изображений с высоким разрешением экрана компьютера. На данный момент это прекрасный пример того, что я пытаюсь проанализировать. Как мы видим, есть просто окно как разница между двумя большими изображениями, и я бы хотел проанализировать только новое окно «Challenge» для любого персонажа.

Первое изображение

Второе изображение

EDIT 2: Я пытаюсь настроить алгоритм в зависимости от проанализированных данных. Обычно на двух следующих рисунках я получаю только зеленые линии в виде различий и никакого текста вообще (что является самым интересным). Я пытаюсь лучше понять, как все это работает.

1-е изображение :

TestImg1

2-е изображение :

TestImg2

Третье изображение : ResultImg

Как вы можете видеть, у меня есть только эти зеленые линии и никогда не текст (в лучшем случае у меня может быть только одна буква при уменьшении счетчиков [i] .size ())

В дополнение к сообщению, которое вы упомянули, вам необходимо:

  • При бинаризации маски используйте пороговое значение выше 0, чтобы удалить небольшие различия.
  • Удалите шум. Вы можете найти все подключенные компоненты и удалить меньшие.
  • Найдите область более крупных подключенных компонентов. Вы можете использовать convexHull и fillConvexPoly чтобы получить маску разных объектов на экране
  • Скопируйте второе изображение на новое изображение с заданной маской.

Результат будет выглядеть так:

введите описание изображения здесь

Код:

 #include  #include  using namespace std; using namespace cv; int main() { Mat3b img1 = imread("path_to_image_1"); Mat3b img2 = imread("path_to_image_2"); Mat3b diff; absdiff(img1, img2, diff); // Split each channel vector masks; split(diff, masks); // Create a black mask Mat1b mask(diff.rows, diff.cols, uchar(0)); // OR with each channel of the N channels mask for (int i = 0; i < masks.size(); ++i) { mask |= masks[i]; } // Binarize mask mask = mask > 100; // Results images vector difference_images; // Remove small blobs //Mat kernel = getStructuringElement(MORPH_RECT, Size(5,5)); //morphologyEx(mask, mask, MORPH_OPEN, kernel); // Find connected components vector> contours; findContours(mask.clone(), contours, CV_RETR_EXTERNAL, CHAIN_APPROX_NONE); for (int i = 0; i < contours.size(); ++i) { if (contours[i].size() > 1000) { Mat1b mm(mask.rows, mask.cols, uchar(0)); vector hull; convexHull(contours[i], hull); fillConvexPoly(mm, hull, Scalar(255)); Mat3b difference_img(img2.rows, img2.cols, Vec3b(0,0,0)); img2.copyTo(difference_img, mm); difference_images.push_back(difference_img.clone()); } } return 0; }