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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ 1:
Пример двух изображений компьютера с высоким разрешением. На данный момент это прекрасный пример того, что я пытаюсь проанализировать. Как мы видим, есть разница между двумя большими изображениями, и я хотел бы проанализировать только новое окно «Вызов» для любого персонажа.

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

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

РЕДАКТИРОВАТЬ 2:
Я пытаюсь настроить алгоритм в зависимости от проанализированных данных. Как правило, на двух следующих рисунках я различаю только зеленые линии, а текст вообще отсутствует (что является наиболее интересным). Я пытаюсь лучше понять, как все это работает.

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

TestImg1

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

TestImg2

3-е изображение:
ResultImg

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

1

Решение

Помимо упомянутого вами поста, вам необходимо:

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

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

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

Код:

#include <opencv2/opencv.hpp>
#include <vector>
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<Mat1b> 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<Mat3b> difference_images;

// Remove small blobs
//Mat kernel = getStructuringElement(MORPH_RECT, Size(5,5));
//morphologyEx(mask, mask, MORPH_OPEN, kernel);

// Find connected components
vector<vector<Point>> 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<Point> 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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]