Согласно этому посту OCR: разница между двумя кадрами, Теперь я знаю, как найти различия в пикселях между двумя изображениями с OpenCV.
Я хотел бы улучшить это решение и использовать его с изображениями высокого разрешения (из видео) с богатым контентом. Приведенный выше пример не применим к большим изображениям, потому что процесс идет медленно (слишком много различий обнаружено, «метод findCountours» заполняет вкладку 250 тысячами элементов, что занимает огромное время на обработку).
Мое приложение использует декодер RLE для декодирования сжатых кадров видео. После того, как кадр декодирован, я хотел бы сравнить текущий кадр с предыдущим, чтобы сохранить различия между двумя кадрами, например, на вкладке «Мат».
Цель всего этого — иметь возможность выполнять анализ разных пикселей и проверять наличие латинского символа. Это позволяет мне уменьшить количество пикселей для анализа и сэкономить драгоценное время.
Если у кого-то есть другие идеи для выполнения таких операций, не стесняйтесь предложить это, пожалуйста.
Спасибо за помощь.
РЕДАКТИРОВАТЬ 1:
Пример двух изображений компьютера с высоким разрешением. На данный момент это прекрасный пример того, что я пытаюсь проанализировать. Как мы видим, есть разница между двумя большими изображениями, и я хотел бы проанализировать только новое окно «Вызов» для любого персонажа.
РЕДАКТИРОВАТЬ 2:
Я пытаюсь настроить алгоритм в зависимости от проанализированных данных. Как правило, на двух следующих рисунках я различаю только зеленые линии, а текст вообще отсутствует (что является наиболее интересным). Я пытаюсь лучше понять, как все это работает.
1-е изображение:
2-е изображение:
Как вы можете видеть, у меня есть только те зеленые линии, а не текст (в лучшем случае, я могу иметь только ОДНУ букву при уменьшении счетчиков [i] .size ())
Помимо упомянутого вами поста, вам необходимо:
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;
}
Других решений пока нет …