Название: Склеивание последовательных изображений Отправлено: 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. Теперь все сводится к поиску одного под массива в другом. Код Теперь для первого столбца второго находим совпадающий солбец справа в первом. Проверяем совпадение "хвоста", если нет - опять ищем продвигаясь по первому справа налево. Ничего не нашли - ну клеим "как есть" возможно вставляя маленькую картинку "разрыв" |