Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

вторник, 12 ноября 2013 г.

Как наложить на видео слайды с помощью AviSynth

Сегодня выступал в НАУ с докладом для студентов. Был приятно удивлен встрече с Антоном. Антон так же готовил свой доклад для студентов. Его доклад полезен будет не только для студентов НАУ, а вообще. Потому я его снял на камеру и сегодня же вечерком аккуратненько смонтировал.

Монтировал необычным для себя путем. Способ мне понравился, а потому опишу его туточки. Видео, уверен, Антон выложит на youtube (будет чуть позже). А пока главный ответ на вопрос - как наложить на видяшку, серию слайдов из презентации, причем чтобы те переключались вовремя. Очень просто.

# грузим в переменную v два подряд идущих видеофайла DSC_0877.MOV и DSC_0878.MOV (они склеятся) 
v = DirectShowSource("DSC_0877.MOV")+DirectShowSource("DSC_0878.MOV") 

# ресайзим видео до размера слайдов, сразу после добавляем сверху от 
# видео бордер такой же высоты как и видео. 
# Там пока все черненько будет - мы расположим там слайды
# результат запишем в ту же переменную v 
v = v.LanczosResize(960,540).AddBorders(0, 540, 0, 0, $000000)

# загрузим первый слайд в переменную slide1 сделав из него видеоряд с частотой 23.976 (та же что и у видео) и длинной 1389 кадров
i=ImageSource("Slide1.png", fps=23.976, end=1389)

# так же для второго слайда
i = i + ImageSource("Slide2.png", fps=23.976, end=8181)

i = i + ImageSource("Slide3.png", fps=23.976, end=5863)

i = i + ImageSource("Slide4.png", fps=23.976, end=9130)

i = i + ImageSource("Slide5.png", fps=23.976, end=7726)

i = i + ImageSource("Slide6.png", fps=23.976, end=4545)

i = i + ImageSource("Slide7.png", fps=23.976, end=673)

# и в конце концов смерджим два потока
Overlay(v, i, mode="blend", opacity=1)

Вау?! И что это за заклинание такое? Это скрипт AviSynth. Не так давно я показывал, как с ее помощью открыть любой файл в VirtualDub. На самом деле тула намного более мощная.

Вот как выглядела папочка с исходниками


 А так выглядел avs скрипт загруженный в VirtualDub (и Антон :) )


Дальше дело техники - выставить аудио/видео кодек и сохранить как avi. Положение кадров я определял задра просматривая видеоролик в поисках характерных кликов Антоном своего презентора. Лучше, конечно, снимать как-то так, чтобы был виден хоть краюшек проектора. 


Кстати, можно было с легкостью сделать как-то так (это фича фильтра Overlay)



Еще раз повторюсь AviSynth очень мощная тулза, позволяющая кстати автоматизировать много чё. Этот вопрос более чем реализовал Стас Фомин в своем SeminarAssembler. Кстати там это все делается уже, я в целях изучения просто еще одно колесо изобрел.  

Успехов!

Спасибо Антону, Стасу, НАУ, AviSynth, VirtualDub, Nikon, Google, HP и всем тем ребятам, с помощью которых этот пост случился.

воскресенье, 10 ноября 2013 г.

TDD это не тесты писать...

TDD - это способ мышления. А тесты обычно - это в контексте разработки кодерами своих модулей. А в жизни много всего, что можно потестить. Везде где есть действие/процесс...

Если ТДД въелся в голову то будет приблизительно так как у меня только что. Пишу в письме коллеге - "... там находится то, что ты просила...", а в голове вопрос цензора "а как проверить?". Та блин! Я жеж не кодю сейчас. Тихо сиди там!!

Ладно иду еще раз перепроверять...

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

Так что не надо тебе ТДД. Меньше знаешь - крепче спишь.

среда, 6 ноября 2013 г.

Когда-нибудь человек перенесет свое сознание в сеть


Люди уже сейчас там... У каждого в руке по мобильнику. Дома по компьютеру. Виртуальные игрушки, социальные сети - там выглядишь привлекательнее, чем мы есть сейчас. А почему это важно, больше казаться, чем быть? Может в детстве недолюбили... Не научили справляться с каждодневным потоком мыслей... А кто научит? Учитель? У его все так же. У всех вокруг так же. Но хватит о себе :)

В реальном мире все же есть красивые места. Очень много красивых мест. Бяка другая - туда далеко идти. Чтобы туда пойти нужны ресурсы - время, знакомства, деньги. Вот вчера я ехал на встречу, было солнечно. Ехал я в район в котором было любопытно погулять. Ехал и думал - отмичусь и прогуляюсь часик. Но пока доехал, солнышко спряталось, тучки напряглись и все - уже не так красиво... А в мире виртуальном - всегда солнечно и ясно, туда надо лишь нырнуть, открыв ноут и запустив какой-то там exe файл...

Интересно, что будет лет через 100? Будет ли матрица? Будут ли люди, полностью погруженные в красивый сон? Будут ли в том мире проблемы? Думаю будут. Осознание наличие проблем - это свойства этого сознания. С ним что-то прийдется сделать...

вторник, 5 ноября 2013 г.

Как повешать блогспот на новый домен

Купил apofig.com решил пошаманить и сделать так, чтобы от apofig.blogspot.com не осталось и следа. То есть чтобы при клике на http://apofig.blogspot.com/blabla.html я переходил на  http://www.apofig.com/blabla.html а там был мой блог и все линки внутри него были бы на новый домен.

Сводится это к трем действиям (после покупки домена). Настроить блоггер на новый домен (делается это в настройках блога). Тут важно указать www.mydomain.com и поставить галочку.

 Когда это делаешь впервые, то блоггер предлагает два проперти занести в настройки домена для подтверждения прав (внимание, эти проперти появляются и потом исчезают после подтверждения, потому лучше их скопипастить и сохранить отдельно) Скриншот взят тут.


Шаг второй - надо прописать эти проперти в настройках домена. Вероятно потребуетсч подождать 1-2 сутки пока обновится. А может повезет и сразу...


И шаг третий - указать прямой редирект с apofig.com на www.apofig.com. Вот и все.





суббота, 2 ноября 2013 г.

Делаем видео панораму

На простых фото панорамах (в том числе сферических) я уже сгрыз все локти.


И вот сутра собирая материал для очередной, пришла идея - а что, если смонтировать видео панораму? Но как? А ХЗ, но точно знаю одно - без сырцов никаких панорам не будет, потому снял 5 видеороликов секунд по 30.

Снимал точно так же как и для фото-панорам - кадры должны перекрываться % на 30, чтобы программа могла найти на них общие точки и смерджить. После поспешил домой, дабы поэксериментировать.

Первым делом полез в гугл и нашел там статью, в которой это самое "КАК?" расписано по самое не могу.  Суть вкратце в том, чтобы сделать видеопанораму надо разобрать ее на серию кадров (каждый кадр, как отдельная фотка), склеить первые кадры из всех видеороликов и создать на основе этого проекта темплейт, по которому прогнать все остальные кадры. После полученные панорамы конвернуть в видео с исходной частотой.  Ну что, цель видна! Вперед.

Исходный материалом будет 5 видеороликов продолжительностью около 20 секунд. Снимал на Nikon, потому формат MOV. Я точно помню, что VirtualDub Mod умеет разбивать видео на кадры и чтобы его подружить с MOV форматом я воспользовался этим советом. Итого у меня получилось как-то так


Каждый видеофайл (avs) по очереди я перегнал в серию bmp изображений и разместил их в отдельных папках. Поехали!

Открываю первый файл в VirtualDub Mod и выбираю на нем интервал, который мне больше всего нравится. Ползунком (1) выбирается положения начала, после чего кликается кнопка (2), затем выбирается конец фрагмента и нажимается кнопавка (3).


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

Во втором и следующих видео (чуть позже) я буду выбирать диапазон отталкиваясь от того, что я выбрал на первом - так как съемка велась не синхронно с 5 камер, а последовательно с 1, то надо совместить периодичность того, что меняется (у нас это волны) на всех 5 выборках. Конечно же мне не удастся найти 5 одинаковых момента, но все же можно найти приблизительно похожие колебания.


После того как я определился с диапазоном я удаляю все, что было до него и после него. Делается это так. Ctrl-X, Ctrl-A, Del, Ctrl-V.

Кстати, на картинке выше можно увидеть насколько перекрываются разные ракурсы.

После того, как в окно VirtualDub Mod перетащил первый аvs файл, выбрал меню File -> Save image sequence... (1) после в диалоге добавил к расширению файла суффикс _N (2), где N - номер видеоролика по порядку. Это надо сделать - так как формат, который кушает следующая программа - [номер кадра]_[номер камеры].[расширение]. Дальше указал папку (3) (для удобства я пока все кадры одной камеры/ракурса сохраняю в отдельную папку). Выбрал bmp (4) как формат без потерь (осторожно в результате на винте будет очень много места скушано). Поставил галку (5), что значит что я сейчас не хочу процессить эту задачу, а добавлю ее в список ожидания. Аминь! (6) Затем перетягиваю в окно программы следующий avs файл и проделываю то же самое, только теперь N=2 и результирующая папка тоже другая.


В результате появилось 5 новых папок, по одной на каждый видеоролик. В каждый папке большое число изображений формата bmp (и каждая весит около 2Gb на 15 секунд видео).


После того, как я опроцессил все видяшки, я удаляю лишнее. Например в первом ролике у меня 16 секунд видео и 390 кадров. Значит в остальных папках можно смело удалять все файлы с номером от 391 и выше.  

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

А выравнивать кадры будем вот так. Понадобится нам программа PTGui в нее загружаем все 390 кадров из первой папки (путем выделения и перетаскивание файлов в окно программы). Есть один нюанс, не позволяющий нам перетаскивать сразу все файлы - их порядок нарушится внутри программы. Потому перетаскиваем вначале файлы с номерами 0-9, потом 10-99 а потом 100-999 и так далее 1000-9999 (для продолжительного видео).

При перетаскивании выскочит диалоговое окно (просто в bmp раскадровке нет информации о линзах фотоаппарата, а потому надо ему помочь) - нажимаем Normal Lens (1) дальше в самой программе жмем Align Images (2) и ждем, пока обработаются все фотки серии.


Так мы заставим программу найти общие точки на каждом кадре и выровнять их тем самым устранив качание камеры в руках.


Может случиться глюк и кадры выравняются как-то не так. Потому после зайдем в Panorama eitor (1) и убедимся, что все кадры наложились один на другой (2).

Если глюк все же случился то пробуем его исправить (как - тема другого поста), а лучше пойти и переснять со штатива.

Дальше нам нужно указать границы по которым программа обрежет фотки в результате. Делается это путем перемещения границы на то место, где она должна быть (1-4). Тут шахматная доска - это то что будет залито черным цветом - его нам в результате не надо.


Так же очень важно, что границу надо опускать немного ниже (5) видимой границы кадра, потому как за ней может быть другой кадр, который чуть ниже размещен (из за того же качания камеры при съемке). Проверить это можно просто прокликивая разные кадры на всем диапазоне (1-390). Если в каком-то видно что в пределах границы появилась шахматка - границу надо опустить....

Вот например у меня на 87 кадре (1) такое случилось (2) и я опустил чуть ниже шахматки желтую границу (3). Самое обидное тут то, что чем дольше снимаешь с рук - тем сильнее уползает камера.



Далее на вкладке Project Assistant (1) нажимаем Advenced (2)



После  на вкладке Create Panorama (1) выбираем размер панорамы максимлаьный (2), указываем, что хотим в результате получить все слои (3) указываем папку, в которую поместим результат (4) и создаем панораму (5).



После в папке ...\1\pan\ появится множество jpeg файлов. Теперь можно удалять исходные bmp - они нам больше не понадобятся.

Ту же процедуру стоит проделать и с другими bmp из других ракурсов.  

Теперь можно заняться поклейкой кадров ракурсов в серию панорам. Подробней об этом.

Для начала в каждой папке с jpeg кадрами ракурса я сделал несложное переименовывание всех файлов в общий формат. Делается это с помощью простого bat-ничка (текстовый файл с расширением bat) с содержимым
rename *.jpg ?????_1.jpg
Это у нас будет первый ракурс. bat для второго ракурса будет
rename *.jpg ?????_2.jpg
И так далее... После выполнения bat файла все файлы переименуются как-то так и порядок их будет строго в порядке увеличения номера кадра.

 
Вслед за этим сливаем все кадры-ракурсы в одну папку.


И первую серию 00000_1 ... 00000_5 отправляем в PT Gui. Там выбираем Normal Lens (1), кликаем Ok (2) и клеим панорамку (3)


Быть может понадобится нам немного выровнять ее, сшить вручную или подкорректировать то, что предложил автомат - это ручная работа. В результате нам надо добиться того, чтобы панорама была максимально ровной. Так же в Panorama Editor стоит обрезать края, как мы это делали раньше. 


Дальше нам стоит отправиться на последнюю вкладку PT Gui и там настроить все как на картинке


Можем собрать панораму и посмотреть как получилось, но это вовсе не обязательно. Нам надо сохранить проект как


Имя стоит выбрать template.pts

После этого потребуется джарник, который я написал для этих целей (есть возможность воспользоваться встроенным в PTGui батчером, но у меня были с ним проблемы и я написал свой). Конечно же для работы с ним понадобится установить java.
Команда выполняется так 'java -jar batch-builder.jar [1] [2] [3] [4] [5]', где:
[1] - Номер первого кадра панорамы (обычно 0)
[2] - Номер последнего кадра панорамы
[3] - Номер первой камеры/ракурса (обычно 1). Все последующие рассчитываются в зависимости от количества кадров в одной панораме.
[4] - (опционально) Имя файла сохраненного проекта pts (по умолчанию 'template.pts')
[5] - (опционально) Формат имен файлов кадров (по умолчанию '%image_%camera.bmp',
                    где %image = задает позицию номера кадра, а %camera - позицию номера ракурса')
[6] - (опционально) задает количество символов в части имени %image.
                    Если параметр равен 0 или не указан, то сичтается что исходные изображения будут называться
                        1_1.bmp, 2_1.bmp, 3_1.bmp ... 10_1.bmp ... 100_1.bmp
                    Если параметр равен, например 6, то ожидается работа с исходными изображениями в формате
                        000001_1.bmp, 00002_1.bmp, 000003_1.bmp ... 000010_1.bmp ... 000100_1.bmp
Итого выполняем команду
D:\pan>java -jar batch-builder.jar 0 390 1 template.pts %image_%camera.jpg 5
Процессинг кадров с номерами [0-2] от для камер начиная с номера 1,
файл шаблона - 'template.pts', формат кадров '%image_%camera.jpg', для номеров кадров включено дополнение до длинны 5.
Обработка началась!
Количество камер в темплейте - 5
Обработка прошла успешно!
В результате в исходной папке появятся так же и файлики от 0_panorama.pts до 390_panorama.pts, открыв любой из которых можно посмотреть склеенную панораму для определенного кадра.

Теперь открываем PTGui, в нем в меню Tools->Batch sticher


И дальше перетягиваем в новооткрытый диалог все тепленькие pts файлы. Тут же начнется сборка панорам.


 Через несколько минут (в зависимости от количества кадров и размера исходных изображений) все будет готово. В исходной папке появятся файлы с 0_panorama.jpg и до 390_panorama.jpg.


Теперь их можно склеить в видео используя уже знакомый нам VirtualDubMod. Для этого выбираем File->Open video file


Далее выбираем первый по порядку файл 0_panorama.jpg (1) и выделяем галочку (2) и открываем (3).


Все файлы загрузятся последовательно. Уменьшим изображение, чтобы оно помещелось на экране - правой кнопкой мыши (1) а потом выбрать (2) процент по-меньше. После запустим плеер и просмотрим результат (3).


 Если VirtualDub крешнулся как у меня - не расстраиваемся. Открываем его с начала и загружаем все рисунки. После можно просмотреть кадр за кадром пользуясь кнопками Влево/Вправо...
 
Теперь нам осталось выбрать кодек и сжать видео. Идем в Video-Compression


Выбираем какой-то подходящий кодек. 


Выбираем очень большой битрейт



Иногда бывает так, что кодек накладывает на исходное видео ограничение (например ширина и высота кадра кратна 4) - в таком случае надо кропнуть размер кадра.

Но наш кодек не накладывает никаких ограничений, а потому мы кроппинг можем скипнуть. На всякий опишу как он делается - меню Video-> Filters


Потом добавить NullTransform фильтр


Дальше выделить его (1) и кликнуть Cropping (2), а на нем обрезать сверху и слева на столько пикселей, чтобы результирующий размер (1) соответствовал требованиям кодека.


Дальше нам надо выйти из этих диалогов. И зайти в File-Save as...


Выбрать имя файла и сохранить видео.

Конечно что-то может пойти не так. А потому надо немного потраблшутить. С вопросами пиши в комментах. Если с кодеком получается лажа (большой файл, скушать не может) значит надо попробовать сохранить видео в несжатом виде. При этом размер будет просто огроменный, но гарантированно будет. После видео можно ужать другими видеоредакторами.



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

пятница, 1 ноября 2013 г.

Все чудеса за пределами зоны комфорта

Удобно, когда все предсказуемо. Но хочется То и Се и вот Это и еще вон То. А пока этого нет. И как это все желанное получить - пока не совсем понятно. Хорошо там где нас нет - говорят и правы. Я бы перефразировал - хорошо вне зоны своего комфорта.


Все что я сделал на сегодняшний день, все о чем думал, мечтал привело меня туда где я сейчас нахожусь. Еще 10 лет назад я об этом мечтал тайком и очень осторожно. Сейчас это реально. Решающим в этом всем были в первую очередь люди, что окружали-заряжали меня и (немного) смелость сменить позу, встать и выйти со своей комфортной зоны. И еще - все, что делалось в прошлом - все мне в помощь. 

Спасибо за это.