Как стать автором
Обновить

Комментарии 75

Здорово! Действительно очень элегантное решение!

А не планируете опубликовать исходники? Понятно, что в статье ключевые моменты освещены, но хотелось бы, так сказать, «комплект»… Чтобы сразу начать эксперименты.

Еще небольшое замечание. Возможно это уже у меня проф.деформация, но мне лично очень мешает, что при переходе фотография в начале стоит на месте (во время микса), и только потом начинает двигаться. Это очень легко поправить, но я думаю будет заметно приятнее.

На счет новых статей — было бы здорово! Про фото-будку — очень интересно. Подписался.
мне лично очень мешает, что при переходе фотография в начале стоит на месте (во время микса), и только потом начинает двигаться

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

Хорошо будет сделать так, как вы сказали, плюс замедлить скорость зума. Такой быстрый ни к чему, достаточно чтобы в кадре ощущалось лёгкое движение. Можно ещё прикрутить рандомно, чтобы не в центр каждый раз зумилось, а в произвольную рандомную точку, или пойти дальше и алгоритмом распознавания лиц находить центр зуммирования.

Ах, да, можно ещё виньетирование, помимо зума сделать рандомный/осмысленный сдвиг кадра и всё такое прочее, чтобы «дороже смотрелось». Но это уже advanced-уровень. :)
Вместо распознавания лиц, можно делать зуммирование «умным кропом», он дешевле распознавания лиц и даёт хорошие результаты на фотографиях разного типа, в т.ч. и без лиц.
Пример работы смарткропа
image
Вот крайне интересно читать о том, как программирование помогает «обычным людям» в решии их повседневных задач. Хоть цифровая фотография и крайне тесна связана с IT, но большинство фотографов кроме как ФШ да ЛР ничего и не умеют, и даже винду переставить не могут, а тут человек пишет не такое уж и простое ПО для себя. Круто. Автор молодец!!!
большинство фотографов кроме как ФШ да ЛР ничего и не умеют, и даже винду переставить не могут


Умения переустановить винду — это самое важное умение для фотографа, да. :)
Нет, это говорит об общей компьютерной грамотности, это лишь яркий показатель
Переустановка винды в наше время это настолько простой процесс, что показателем компьютерной грамотности не является. Воткнул диск, да два-три раза нажал «далее». Даже установка какой-нибудь убунты — тоже не показатель грамотности.
А вот запуск линукса на телефоне и дальнейший запуск там самописной программы — это показатель.
Так в том то и дело
Воткнул диск, да два-три раза нажал «далее»
а большинство не могут. Это как раз показатель низкой компьютерной грамотности, о чём я и говорил изначально.
Могут, просто боятся. Или не хотят.
Но при этом могут быть хорошими фотографами, дизайнерами, бухгалтерами или даже программистами.
Самое главное умение фотографа на пк (помимо обработки фото) либо делать backup, либо Raid, второе умение — восстанавливать уделенные фото…
либо делать backup, либо Raid
Резервная копия не заменяет RAID-массив и наоборот.
не всегда важен способ главное, чтобы был дубль. Но грамотное приятнее безграмотного. Согласен с Вами.
Так вот RAID как раз «дублей» и не обеспечивает. От удаленных и испорченных файлов не спасёт.
RAID — 1 например спасет от испорченных файлов, либо убийством одного из дисков. От удаления Да — не спасет, но удаление, чаще всего — осознанный шаг
Удалив файл с массива, Вы удалите и «дубль». Тот же файл останется в резервной копии. Почувствуйте разницу.
Да у меня скорее нетипичный случай )
Программировать начал раньше чем фотографировать. В одно время встал выбор, в какую сторону двигаться дальше — приглашали работать программистом в достаточно хорошую компанию, но выбрал фотографию.
По мелочи тоже здорово помогает. Например, как то надоело ждать, как любимый резайсер фотографий делает все в один поток, написал свой )
Работал в студии, где у каждого фотографа была своя, очень некислая рабочая станция, предоставленная фирмой, но всё что касается софта, лежало на плечах фотографов/художников/верстальщиков и их познания в сфере тонкого тюнинга софта и железа меня поражали.
В общем, если убрать код, то процесс выглядит так:

1) На экране фотоаппарата отбираете фото
2) Карту памяти подключаете к телефону, из отмеченных фото выдергиваете джпеги
3) Через веб-интерфейс для вашей программы указываете параметры конвертирования, ждёте
4) На выходе — видеофайл со слайдшоу.

Так?
Да, все именно так!
А в чем фишка снимать в RAW, а потом дергать оттуда превью джипег?
Чтобы не расходовать место на джпеги, например.
Слайдшоу в день съемки, это вторично. Главное все же, это фотографии. Для гарантированного результата, нужны raw.
Вытащить jpeg из raw — простая и быстрая операция. Если бы её не было, то быстрее и проще не стало бы, так как остаётся все остальное.
Круто, спасибо. Программирование действительно во многих случаях помогает. Я вот Python и OpenCV начал учить. Удивительно, но офигенно полезно для врача-исследователя в лаборатории.
Вот я бы послушал на эту тему, пилите пост :)

Вот первые робкие шаги) Пока обучаю видеть метки. С python и OpenCV никогда раньше не стлакивался. Пока идет довольно легко. Хотя меня вымораживает неопределенность в типе переменной. Хрен ти что может храниться. То ли контейнер с массивом какой-то фигни, то ли кадр, то ли Boolean. очень легко запутаться и налажать, если переменные плохо названы. Возможно я чего-то не понимаю пока. До этого немного C ковырял.
ИМХО было ошибкой одеть рубашку того же цвета, как и метки. Или так и было задумано? :)
Вообще ошибся) но это самое начало. Только сегментация. Я потом ещё фильтры крутил, erode/dilate, определение координат и прочее.
Радует глаз когда специалисты нетехнических специальностей так глубоко копают :)
В штатах это давно норма, когда какой-нибудь бизнес-аналитик пишет свой аналитический софт под конкретные задачи и инструмент тут не важен, видел на Excel таких монстров, что возникал вопрос «и кто тут программист». Мне также приносили задачки типа «Я тут в Access накидал базу, давай сделаем нормальный сетевой вариант?», я открываю это «накидал», и понимаю что это месяцы работы, а приносит это далеко не программист. Важно, что только человек, глубоко знакомый с предметной областью, понимает все тонкости того, что нужно автоматизировать.
Думаю что скоро к тому придём, что на уровне школы программирование будет преподаваться на уровне иностранных языков.
Спасибо) в итоге, правда, код наполовину из комментариев, чтобы не забыть и все время явно изобретаю велосипед. Хотя работает, да. И не хватает математики и базовых универсальных алгоритмов. Сейчас думаю, как корректнее определить центроид четырёхугольника при наличии координат вершин. Среднее арифметическое (x,y) странно выглядит.
А в чём собственно проблема? Считаем центроиды четырёх треугольников, проводим к ним линии из противоположных вершин, ищем точки пересечения. Или проблема это именно алгоритмически и эффективно реализовать?
Проблема алгоритмически. Я до сих пор не привыкну к манипуляции массивами точек. Трудно) Вот пока наброски кода. Примитивненько, но мне еще надо учиться:

Код
# The distance between green marks shuold be at least 4a, where "a" is the width of the square.
# It's easier to draw the area around the central point between them.

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

def nothing(x):
    pass

cv2.namedWindow('mask')

# Create sliders for range adjusting
cv2.createTrackbar('Hue_low', 'mask', 40, 255, nothing)
cv2.createTrackbar('Hue_high', 'mask', 76, 255, nothing)
cv2.createTrackbar('Saturation_low', 'mask', 81, 255, nothing)
cv2.createTrackbar('Saturation_high', 'mask', 255, 255, nothing)

while True:
    # flashing the counter
    centrIndex = 0
    # init list
    centroidListX = []
    centroidListY = []

    # Take each frame
    _, frame = cap.read()

    # Convert BGR to HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # Get current slider position
    Hue_low = cv2.getTrackbarPos('Hue_low', 'mask')
    Hue_high = cv2.getTrackbarPos('Hue_high', 'mask')
    Sat_low = cv2.getTrackbarPos('Saturation_low', 'mask')
    Sat_high = cv2.getTrackbarPos('Saturation_high', 'mask')

    # define range of green color in HSV
    lower_green = np.array([Hue_low, Sat_low, 40])
    upper_green = np.array([Hue_high, Sat_high, 250])

    # Threshold the HSV image to get only blue colors
    mask = cv2.inRange(hsv, lower_green, upper_green)

    #Erode disabled to speedup. Works nice without it.
    mask = cv2.erode(mask, None, iterations = 1)
    mask = cv2.dilate(mask, None, iterations = 1)

    # Bitwise-AND mask and original image
    image_result = cv2.bitwise_and(frame, frame, mask=mask)

    # Detecting edges
    image_mask_blur = cv2.medianBlur(mask, 3)
    image_canny = cv2.Canny(image_mask_blur, 30, 150)

    # Closing gaps
    kernel_canny = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
    image_canny_closed = cv2.morphologyEx(image_canny, cv2.MORPH_CLOSE, kernel_canny)

    # Finding contours
    (cnts, _) = cv2.findContours(image_canny_closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for c in cnts:

        # approximate the contour
        peri = cv2.arcLength(c, True)
        approx = cv2.approxPolyDP(c, 0.03 * peri, True)
        # get the bounding box with it's coordinates and aspect ratio
        (x,y,w,h) = cv2.boundingRect(approx)
        aspectRatio = w / float(h)

        # initialize bool variables
        boolRectangle = False
        boolPeri = False
        boolAspect = False

        if len(approx) >= 4 and len(approx) <= 6:
            boolRectangle = True
        if peri >= 50:
            boolPeri = True
        if aspectRatio > 0.9 and aspectRatio < 1.1:
            boolAspect = True

        if boolRectangle and boolPeri and boolAspect:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)

            # get centroid of rectangle
            centroidX = x + w/2
            centroidY = y + h/2
            centroidListX.append(centroidX)
            centroidListY.append(centroidY)

            cv2.circle(frame, (centroidListX[centrIndex], centroidListY[centrIndex]), 1,(0,0,255),3)
            centrIndex += 1

            if centrIndex == 4:
                centroidMainX = 0
                centroidMainY = 0
                for loopIndex in range(0, 3):
                    centroidMainX = centroidMainX + centroidListX[loopIndex]
                    centroidMainY = centroidMainY + centroidListY[loopIndex]
                centroidMainX = centroidMainX/4
                centroidMainY = centroidMainY/4
                cv2.circle(frame, (centroidMainX, centroidMainY), 5, (0, 0, 255),3)
                cv2.rectangle(frame, (centroidMainX - int(peri),centroidMainY + int(peri)), (centroidMainX + int(peri), centroidMainY - int(peri)), (0,255,255), 2)
        cv2.imshow('frame', frame)

    # Visualization
    cv2.imshow('mask', image_result)
    #cv2.imshow('canny_closed', image_canny_closed)
    #cv2.imshow('canny', image_canny)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()


Посмотрю. но я пока на 2.7. Сейчас Ubuntu 14.04 на работе, не хочу сильно ворошить систему вручную. Перейду на 16.04 — обновлюсь.
Очень приятная штука, когда благодаря программирования, у тебя развязываются руки )
я может быть напишу глупость, но почему нельзя было сделать то же самое силами самого андроида?
Привычные инструменты, отсутствие необходимости мусорить в системе, легкий перенос с места на место…

Каким образом? Есть софт, который что то может делать по отдельности, но много ручной работы.
Приличных программ для создания слайдшоу, например, не нашёл. Все пытаются сделать его квадратным для инстаграма. А уж чтоб сохранить только снимки с рейтингами, да ещё из raw пакетно, никто не умеет.
Написать код с такой же функциональностью на Java, наверняка там множество готовых библиотек для изображений и видео
Думаю, проблем написать на Java нет, но рассказ не об этом.
У меня «одноразовое» решения для личного пользования. Сделал максимально быстрым для себя способом.
Да, я про это и спрашивал, тем более, что опыт программирования у автора есть. Заодно мог бы и продавать продукт, наверняка бы нашлась бы целевая аудитория.
Игорь, наблюдаю за вашим python-творчеством еще с времен Симбиан и s40 — ваши статьи всегда интересны, пишите еще. Смотря на ваши работы в программировании, вспоминаются слова Advice from an Old Programmer из Learn Python The Hard Way
...Programming as a profession is only moderately interesting. It can be a good job, but you could make about the same money and be happier running a fast food joint. You're much better off using code as your secret weapon in another profession.
Symbian, хорошие были времена. У меня был смартфон, но не было компьютера и я тогда читал Россума (book ods) и писал скрипты прямо на смартфоне, с экраном 174х208, сейчас с трудом себе это представляю. Может и мои работы вам знакомы — MP3Editor, MBM Tool, AIF Tool, GIF Tool. Мы с Игорем тогда общались на димонвидео, можно сказать вместе работали.
Да да, это было трудное, но веселое «детство») Спасибо за то, что сподвиг вообще начать заниматься программированием )
MBM Tool помню — ресурсы менял на своей старенькой Nokia N76, благодаря чему все одногрупники несли свои телефоны на починить и настроить мне. Спасибо вам за нее.
Сразу несколько вопросов:
1. Сколько уходит зарядки у вашего смартфона на 1 описанный вами цикл.
2. А если кто нибудь вам позвонит в момент рендера?
3. Не виснет, не глючит? Прямо все без нареканий?
В момент, когда задействованы 4 ядра на все 100, да, глючит и лагает, на звонок ответить затруднительно. Но это длится минут 10. Да и в это время не до звонков — на съёмках же )
По поводу заряда, не замерял, но не думаю что уйдёт заряда больше чем за 15-20 минут работы какой нибудь требовательной игрушки.
Очень круто!

Только думаю, что все действительно можно соединить в одном полноценном приложении. И что-то мне подсказывает, что такие проги уже есть)

Вот крайне интересно читать о том, как программирование помогает «обычным людям» в решии их повседневных задач.
+1 решение проблем — это самый кайф в нашем деле!
Уж очень специфичная штука, чтоб такое приложение уже было ) даже на PC готового нет. По отдельности — пожалуйста, но вот все вместе нет.
А у вас не было мысли запилить такое приложение? Мне кажется, среди фотографов было бы весьма востребованным.
Тут проблема — кроме питона, мне всегда было лень что то новое изучать (за исключением немного c++ для микроконтроллеров), а распространять приложение в виде скриптов для Linux deploy среди не айтишников, которые почти все на iOS — бесполезно )
Супер! Делитесь своим опытом, у вас прекрасно получается!!! Спасибо за столько интересный рассказ! Не думали оформить все либой и где-нибудь распространять за не бесплатно?
Спасибо. Нет, не думал. Программирование это хобби, основной доход другой.
Единственное, что, сделал коммерческий заказ на доработку софтины для коллеги, который занимается видео. Все тоже самое, но половину функционала не понадобилось, так как видео нужно склеивать напрямую, без какой либо обработки.
Замечательное решение и отличная статья. Частенько вот сталкивался с мнением, де никак фотографу под Linux работать не удастся, мол фотошопа нет и тому подобное. А оно вон как получается, отличная автоматизация рабочего процесса.
Да, но без Windows, если занимаешься коммерческой съемкой, действительно очень сложно. Как раз таки из за фотошопе и тому подобное. Аналоги есть, но до коммерческого применения не дотягивают. С удовольствием поучаствовал бы, например, в работе над dark table, но не хватает времени (
Мне RawTherapee нравится. Правда фотки больше научного характера. Камера микроскопа, макрофотографии образцов со штатива…
Я не буду говорить про цвет, профили камер и объективов, это все субъективно.
Когда ты целыми днями работаешь с программой, любой косяк интерфейса или тормоза очень и очень мешают.
Пару фотографий обработать можно, но вот когда их сотни и тысячи (
Lightroom удобнее, согласен. Но у меня большая часть работы в Linux идёт.
Это всё же не работа фотографа получилась, а работа программиста.
О пригодности линукса для фотографа оно не говорит.
О пригодности линукса для фотографа говорит использование линукса фотографом.
То есть если фотограф на линукс-машине только лазит по интернету — это тоже считается «использованием линукса фотографом»?

Нет. Это значит, если фотограф использует линукс для работы с фотографией.
В описываемом случае — не фотограф, а программист.
Вы молодец! Ограничения всегда порождают продуманные и интересные решения.
Например, на очереди статья, как сделать вот такую милую и функциональную фотобудку

Можно карманный принтер к фотоаппарату синей изолентой примотать, дешево и сердито!
Шикарный пост!

У вас так понимаю Canon с карточками формата Compact Flash? Это к телефону картридер еще нужно подключать?
Голосую за статью про фотобудку!
exiftool можно заменить на pyexiv2, больше возможностей и код проще
Спасибо, посмотрю на него еще раз — когда то у меня с ним не срослось, не помню почему.
Pillow кстати тоже может читать exif, но почему то не все теги и не всегда )
from PIL import Image,ExifTags
img=Image.open(PATH_TO_IMAGE)
exif=dict((ExifTags.TAGS[k], v) for k, v in img._getexif().items() if k in ExifTags.TAGS)
Да у меня на c++ тоже с exiv2 не срослось, но там видимо отсутствие опыта с самим c++, а как на python попробовал, завелось и заработало на ура сразу же
Да, отличное решение с Linux Deploy! Сразу возникают мысли, как еще можно это использовать. Ведь в кармане у каждого лежит приличный компьютер да еще всегда подключенный к интернет. Можно и веб сервер с интернет магазином на нем развернуть. Хостинг открыть.
Даже биткоины можно потихоньку майнить :)
Аха, а через час-два бежать искать розетку )
А вот использовать старенькие смартфоны или планшеты, которые валяются дома — почему нет.
Круто, мощность смартфонов, о которой много говорится, реально используется в деле.

Объединять видео файлы можно так (https://trac.ffmpeg.org/wiki/Concatenate)

ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
С mpg было проще через cat сделать. И наверняка быстрее, не знаю, что ffmpeg там с этим делает внутри )
ffmpeg внутри делает то же самое — копирует видеопотоки. Скорость по идее та же. Разница только в том, что заголовок с параметрами файла он поставит только один — в начале файла.
Я таким способом объединяю MTS файлы с видеокамеры — она их ограничивает в 2ГБ размером.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации