Russian Qt Forum

Программирование => Алгоритмы => Тема начата: ecspertiza от Октябрь 01, 2013, 10:17



Название: Склеивание последовательных изображений
Отправлено: ecspertiza от Октябрь 01, 2013, 10:17
Есть достаточно интересная задача. Нужно с выделенной области экрана пользователя получать изображения и склеивать их в похожих фрагментах (на подобии панорамной съемки). Для чего это нужно, например у пользователя есть потребность снять страничку в браузере целиком, всю длинную партянку длинной скажем 3000 пикселей. Безусловно кто то скажет что можно использовать расширения и прочее, но на данный момент есть задача такого функционала для софта. Так как софт кроссплатформенный навряд ли получится получать хандл окна всех браузеров под всеми платформами. Поэтому есть идея просто получать скриншоты с выделенной области и склеивать их. Ну вот допустим я получил несколько последовательных изображений, возникает вопрос, что с ними делать дальше, как сравнивать, как склеивать ? На данный момент у меня есть такая идея:

1. Имеем два последовательных изображения.
2. Переведем их в монохромный массив (название сам придумал, не ругайте) - это значит что мы создадим двумерный массив размером с ширину и высоту исходной картинки затем получаем каждый пиксель изображения, и если средняя сумма rgb меньше 255*3 то элемент массива ставим равным 0 иначе 1.
3. Теперь все сводится к поиску одного под массива в другом.
4. После того как нашли подмассив, исходя из совпадений склеиваем изображения.

Вот такая идея есть у меня для решения этой задачи, тестовую пример еще реализую. Хотелось бы узнать у более опытных, может кто то сталкивался с подобной задачей или знает более верное решение ?


Название: Re: Склеивание последовательных изображений
Отправлено: Bepec от Октябрь 01, 2013, 10:43
Я бы просто брал полоску шириной в N от конца скриншота  и пробегался по следующему скриншоту в поисках совпадения. В принципе это не такая уж и ресурсоёмкая операция.

PS опыта маловато, но чем мог помог :)


Название: Re: Склеивание последовательных изображений
Отправлено: Igors от Октябрь 01, 2013, 11:22
Упрощенный пример: первый скриншот содержит белый кусок справа (с конца) а второй белый слева (с начала). Нет возможности определить какие столбцы оригиналы а какие пересечения.

Еще соображения: необходимость сделать неск скриншотов не то чтобы тяжела, но скажем, юзера "не порадует".  А если скролл приличный - вылетите по размеру имеджа. В общем мрачно   


Название: Re: Склеивание последовательных изображений
Отправлено: ecspertiza от Октябрь 01, 2013, 11:37
Igors, насчет первого согласен, поэтому и не хочу брать куски изображения, думаю стоит отталкиваться от некого порога совпадения массивов, хотя могут быть проблемы с текстом, или может быть поиск одинаковых точек (только как их искать пока не представляю). Насчет размера QImage, если честно не помню как его высчитать, но думаю максимальная ширина будет 1920px , а отсюда можно посчитать высоту и ограничить ее для пользователей, не думаю ,что она получится маленькой.


Название: Re: Склеивание последовательных изображений
Отправлено: Bepec от Октябрь 01, 2013, 16:21
Кхм. Я думал мы говорим о скриншоте страницы браузера. Как там может получаться кусок слева белый и кусок справа белый, если скриншоты сделаны с наложением?

Я отталкивался именно от мысли аля пользователь крутит страницу и делает скрины. Соответственно нужно убрать наложения и получить портянку настоящей страницы.

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


Название: Re: Склеивание последовательных изображений
Отправлено: kamre от Октябрь 01, 2013, 16:47
Как там может получаться кусок слева белый и кусок справа белый, если скриншоты сделаны с наложением?
Например, попалась страница с флэш-роликом (gif-анимацией) и наложение получилось как раз по ролику. Скриншоты зафиксировали разные моменты в ролике и ничего общего у наложений нет.


Название: Re: Склеивание последовательных изображений
Отправлено: Igors от Октябрь 01, 2013, 17:06
Как-то все это "не смотрится", в духе 90-х или раньше :) Идейное/нормальное решение выглядело бы как забрать у браузера страницу и шлепнуть ее на контексте битмапа. Все равно страдать - так уж за дело  :)


Название: Re: Склеивание последовательных изображений
Отправлено: Bepec от Октябрь 01, 2013, 17:57
to Kamre - а давайте вы определите что это следующий скриншот :D Если вся страница меняется ежесекундно? :P

Ответ - никак :D


Название: Re: Склеивание последовательных изображений
Отправлено: ecspertiza от Октябрь 01, 2013, 23:08
Как-то все это "не смотрится", в духе 90-х или раньше :) Идейное/нормальное решение выглядело бы как забрать у браузера страницу и шлепнуть ее на контексте битмапа. Все равно страдать - так уж за дело  :)

мне в обще больше нравится идея с расширением для браузера, но браузер я привел только для примера, а если это документ Word или текстовый документ или еще что нибудь, таблица из программы например. Поэтому и есть мысли именно по склеиванию картинок.


Название: Re: Склеивание последовательных изображений
Отправлено: Bepec от Октябрь 02, 2013, 09:25
to ecspertiza: А как вы собираетесь склеивать скриншоты без наложения?


Название: Re: Склеивание последовательных изображений
Отправлено: ecspertiza от Октябрь 02, 2013, 09:59
А никто и не говорит ,что наложения (я так понимаю это одинаковые части изображения) не будет. В идеале я бы получал картинку с экрана хотя бы раз 5ть в секунду и естественно склеивал бы портянку.


Название: Re: Склеивание последовательных изображений
Отправлено: Igors от Октябрь 02, 2013, 10:14
Ладно, постановка какая есть, вернемся к содержательной части
2. Переведем их в монохромный массив (название сам придумал, не ругайте) - это значит что мы создадим двумерный массив размером с ширину и высоту исходной картинки затем получаем каждый пиксель изображения, и если средняя сумма rgb меньше 255*3 то элемент массива ставим равным 0 иначе 1.
3. Теперь все сводится к поиску одного под массива в другом.
Нормально, только зачем монохромнвй, средняя сумма и.т.п.? Это можно сделать комфортно, используя для накопления "просто суммы"
Код
C++ (Qt)
struct Real_RGB {
float r, g, b;
};
Теперь для первого столбца второго находим совпадающий солбец справа в первом. Проверяем совпадение "хвоста", если нет - опять ищем продвигаясь по первому справа налево. Ничего не нашли - ну клеим "как есть" возможно вставляя маленькую картинку "разрыв"