Russian Qt Forum
Ноябрь 22, 2024, 14:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Склеивание последовательных изображений  (Прочитано 8850 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Октябрь 01, 2013, 10:17 »

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

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

Вот такая идея есть у меня для решения этой задачи, тестовую пример еще реализую. Хотелось бы узнать у более опытных, может кто то сталкивался с подобной задачей или знает более верное решение ?
Записан
Bepec
Гость
« Ответ #1 : Октябрь 01, 2013, 10:43 »

Я бы просто брал полоску шириной в N от конца скриншота  и пробегался по следующему скриншоту в поисках совпадения. В принципе это не такая уж и ресурсоёмкая операция.

PS опыта маловато, но чем мог помог Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 01, 2013, 11:22 »

Упрощенный пример: первый скриншот содержит белый кусок справа (с конца) а второй белый слева (с начала). Нет возможности определить какие столбцы оригиналы а какие пересечения.

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

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Октябрь 01, 2013, 11:37 »

Igors, насчет первого согласен, поэтому и не хочу брать куски изображения, думаю стоит отталкиваться от некого порога совпадения массивов, хотя могут быть проблемы с текстом, или может быть поиск одинаковых точек (только как их искать пока не представляю). Насчет размера QImage, если честно не помню как его высчитать, но думаю максимальная ширина будет 1920px , а отсюда можно посчитать высоту и ограничить ее для пользователей, не думаю ,что она получится маленькой.
Записан
Bepec
Гость
« Ответ #4 : Октябрь 01, 2013, 16:21 »

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

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

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

Сообщений: 233


Просмотр профиля
« Ответ #5 : Октябрь 01, 2013, 16:47 »

Как там может получаться кусок слева белый и кусок справа белый, если скриншоты сделаны с наложением?
Например, попалась страница с флэш-роликом (gif-анимацией) и наложение получилось как раз по ролику. Скриншоты зафиксировали разные моменты в ролике и ничего общего у наложений нет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Октябрь 01, 2013, 17:06 »

Как-то все это "не смотрится", в духе 90-х или раньше Улыбающийся Идейное/нормальное решение выглядело бы как забрать у браузера страницу и шлепнуть ее на контексте битмапа. Все равно страдать - так уж за дело  Улыбающийся
Записан
Bepec
Гость
« Ответ #7 : Октябрь 01, 2013, 17:57 »

to Kamre - а давайте вы определите что это следующий скриншот Веселый Если вся страница меняется ежесекундно? Показает язык

Ответ - никак Веселый
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #8 : Октябрь 01, 2013, 23:08 »

Как-то все это "не смотрится", в духе 90-х или раньше Улыбающийся Идейное/нормальное решение выглядело бы как забрать у браузера страницу и шлепнуть ее на контексте битмапа. Все равно страдать - так уж за дело  Улыбающийся

мне в обще больше нравится идея с расширением для браузера, но браузер я привел только для примера, а если это документ Word или текстовый документ или еще что нибудь, таблица из программы например. Поэтому и есть мысли именно по склеиванию картинок.
Записан
Bepec
Гость
« Ответ #9 : Октябрь 02, 2013, 09:25 »

to ecspertiza: А как вы собираетесь склеивать скриншоты без наложения?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #10 : Октябрь 02, 2013, 09:59 »

А никто и не говорит ,что наложения (я так понимаю это одинаковые части изображения) не будет. В идеале я бы получал картинку с экрана хотя бы раз 5ть в секунду и естественно склеивал бы портянку.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Октябрь 02, 2013, 10:14 »

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


Страница сгенерирована за 0.153 секунд. Запросов: 22.