Комментарии 75
Здорово! Действительно очень элегантное решение!
А не планируете опубликовать исходники? Понятно, что в статье ключевые моменты освещены, но хотелось бы, так сказать, «комплект»… Чтобы сразу начать эксперименты.
Еще небольшое замечание. Возможно это уже у меня проф.деформация, но мне лично очень мешает, что при переходе фотография в начале стоит на месте (во время микса), и только потом начинает двигаться. Это очень легко поправить, но я думаю будет заметно приятнее.
На счет новых статей — было бы здорово! Про фото-будку — очень интересно. Подписался.
А не планируете опубликовать исходники? Понятно, что в статье ключевые моменты освещены, но хотелось бы, так сказать, «комплект»… Чтобы сразу начать эксперименты.
Еще небольшое замечание. Возможно это уже у меня проф.деформация, но мне лично очень мешает, что при переходе фотография в начале стоит на месте (во время микса), и только потом начинает двигаться. Это очень легко поправить, но я думаю будет заметно приятнее.
На счет новых статей — было бы здорово! Про фото-будку — очень интересно. Подписался.
мне лично очень мешает, что при переходе фотография в начале стоит на месте (во время микса), и только потом начинает двигаться
Тоже об это глаз каждый раз спотыкался, неплохо бы начинать движение сразу.
Подтверждаю, дискомфортно.
Хорошо будет сделать так, как вы сказали, плюс замедлить скорость зума. Такой быстрый ни к чему, достаточно чтобы в кадре ощущалось лёгкое движение. Можно ещё прикрутить рандомно, чтобы не в центр каждый раз зумилось, а в произвольную рандомную точку, или пойти дальше и алгоритмом распознавания лиц находить центр зуммирования.
Ах, да, можно ещё виньетирование, помимо зума сделать рандомный/осмысленный сдвиг кадра и всё такое прочее, чтобы «дороже смотрелось». Но это уже advanced-уровень. :)
Хорошо будет сделать так, как вы сказали, плюс замедлить скорость зума. Такой быстрый ни к чему, достаточно чтобы в кадре ощущалось лёгкое движение. Можно ещё прикрутить рандомно, чтобы не в центр каждый раз зумилось, а в произвольную рандомную точку, или пойти дальше и алгоритмом распознавания лиц находить центр зуммирования.
Ах, да, можно ещё виньетирование, помимо зума сделать рандомный/осмысленный сдвиг кадра и всё такое прочее, чтобы «дороже смотрелось». Но это уже advanced-уровень. :)
Вот крайне интересно читать о том, как программирование помогает «обычным людям» в решии их повседневных задач. Хоть цифровая фотография и крайне тесна связана с IT, но большинство фотографов кроме как ФШ да ЛР ничего и не умеют, и даже винду переставить не могут, а тут человек пишет не такое уж и простое ПО для себя. Круто. Автор молодец!!!
большинство фотографов кроме как ФШ да ЛР ничего и не умеют, и даже винду переставить не могут
Умения переустановить винду — это самое важное умение для фотографа, да. :)
Нет, это говорит об общей компьютерной грамотности, это лишь яркий показатель
Переустановка винды в наше время это настолько простой процесс, что показателем компьютерной грамотности не является. Воткнул диск, да два-три раза нажал «далее». Даже установка какой-нибудь убунты — тоже не показатель грамотности.
А вот запуск линукса на телефоне и дальнейший запуск там самописной программы — это показатель.
А вот запуск линукса на телефоне и дальнейший запуск там самописной программы — это показатель.
Так в том то и дело
Воткнул диск, да два-три раза нажал «далее»
а большинство не могут. Это как раз показатель низкой компьютерной грамотности, о чём я и говорил изначально.
Воткнул диск, да два-три раза нажал «далее»
а большинство не могут. Это как раз показатель низкой компьютерной грамотности, о чём я и говорил изначально.
Самое главное умение фотографа на пк (помимо обработки фото) либо делать backup, либо Raid, второе умение — восстанавливать уделенные фото…
либо делать backup, либо RaidРезервная копия не заменяет RAID-массив и наоборот.
не всегда важен способ главное, чтобы был дубль. Но грамотное приятнее безграмотного. Согласен с Вами.
Так вот RAID как раз «дублей» и не обеспечивает. От удаленных и испорченных файлов не спасёт.
Удалив файл с массива, Вы удалите и «дубль». Тот же файл останется в резервной копии. Почувствуйте разницу.
Да у меня скорее нетипичный случай )
Программировать начал раньше чем фотографировать. В одно время встал выбор, в какую сторону двигаться дальше — приглашали работать программистом в достаточно хорошую компанию, но выбрал фотографию.
По мелочи тоже здорово помогает. Например, как то надоело ждать, как любимый резайсер фотографий делает все в один поток, написал свой )
Программировать начал раньше чем фотографировать. В одно время встал выбор, в какую сторону двигаться дальше — приглашали работать программистом в достаточно хорошую компанию, но выбрал фотографию.
По мелочи тоже здорово помогает. Например, как то надоело ждать, как любимый резайсер фотографий делает все в один поток, написал свой )
Работал в студии, где у каждого фотографа была своя, очень некислая рабочая станция, предоставленная фирмой, но всё что касается софта, лежало на плечах фотографов/художников/верстальщиков и их познания в сфере тонкого тюнинга софта и железа меня поражали.
В общем, если убрать код, то процесс выглядит так:
1) На экране фотоаппарата отбираете фото
2) Карту памяти подключаете к телефону, из отмеченных фото выдергиваете джпеги
3) Через веб-интерфейс для вашей программы указываете параметры конвертирования, ждёте
4) На выходе — видеофайл со слайдшоу.
Так?
1) На экране фотоаппарата отбираете фото
2) Карту памяти подключаете к телефону, из отмеченных фото выдергиваете джпеги
3) Через веб-интерфейс для вашей программы указываете параметры конвертирования, ждёте
4) На выходе — видеофайл со слайдшоу.
Так?
Да, все именно так!
А в чем фишка снимать в RAW, а потом дергать оттуда превью джипег?
Круто, спасибо. Программирование действительно во многих случаях помогает. Я вот Python и OpenCV начал учить. Удивительно, но офигенно полезно для врача-исследователя в лаборатории.
Вот я бы послушал на эту тему, пилите пост :)
Вот первые робкие шаги) Пока обучаю видеть метки. С python и OpenCV никогда раньше не стлакивался. Пока идет довольно легко. Хотя меня вымораживает неопределенность в типе переменной. Хрен ти что может храниться. То ли контейнер с массивом какой-то фигни, то ли кадр, то ли Boolean. очень легко запутаться и налажать, если переменные плохо названы. Возможно я чего-то не понимаю пока. До этого немного C ковырял.
ИМХО было ошибкой одеть рубашку того же цвета, как и метки. Или так и было задумано? :)
Вообще ошибся) но это самое начало. Только сегментация. Я потом ещё фильтры крутил, erode/dilate, определение координат и прочее.
Радует глаз когда специалисты нетехнических специальностей так глубоко копают :)
В штатах это давно норма, когда какой-нибудь бизнес-аналитик пишет свой аналитический софт под конкретные задачи и инструмент тут не важен, видел на Excel таких монстров, что возникал вопрос «и кто тут программист». Мне также приносили задачки типа «Я тут в Access накидал базу, давай сделаем нормальный сетевой вариант?», я открываю это «накидал», и понимаю что это месяцы работы, а приносит это далеко не программист. Важно, что только человек, глубоко знакомый с предметной областью, понимает все тонкости того, что нужно автоматизировать.
Думаю что скоро к тому придём, что на уровне школы программирование будет преподаваться на уровне иностранных языков.
В штатах это давно норма, когда какой-нибудь бизнес-аналитик пишет свой аналитический софт под конкретные задачи и инструмент тут не важен, видел на 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()
в Python 3.5 имеется Type Hinting:
blog.jetbrains.com/pycharm/2015/11/python-3-5-type-hinting-in-pycharm-5
blog.jetbrains.com/pycharm/2015/11/python-3-5-type-hinting-in-pycharm-5
Очень приятная штука, когда благодаря программирования, у тебя развязываются руки )
я может быть напишу глупость, но почему нельзя было сделать то же самое силами самого андроида?
Привычные инструменты, отсутствие необходимости мусорить в системе, легкий перенос с места на место…
Каким образом? Есть софт, который что то может делать по отдельности, но много ручной работы.
Приличных программ для создания слайдшоу, например, не нашёл. Все пытаются сделать его квадратным для инстаграма. А уж чтоб сохранить только снимки с рейтингами, да ещё из raw пакетно, никто не умеет.
Приличных программ для создания слайдшоу, например, не нашёл. Все пытаются сделать его квадратным для инстаграма. А уж чтоб сохранить только снимки с рейтингами, да ещё из 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. Мы с Игорем тогда общались на димонвидео, можно сказать вместе работали.
Сразу несколько вопросов:
1. Сколько уходит зарядки у вашего смартфона на 1 описанный вами цикл.
2. А если кто нибудь вам позвонит в момент рендера?
3. Не виснет, не глючит? Прямо все без нареканий?
1. Сколько уходит зарядки у вашего смартфона на 1 описанный вами цикл.
2. А если кто нибудь вам позвонит в момент рендера?
3. Не виснет, не глючит? Прямо все без нареканий?
В момент, когда задействованы 4 ядра на все 100, да, глючит и лагает, на звонок ответить затруднительно. Но это длится минут 10. Да и в это время не до звонков — на съёмках же )
По поводу заряда, не замерял, но не думаю что уйдёт заряда больше чем за 15-20 минут работы какой нибудь требовательной игрушки.
По поводу заряда, не замерял, но не думаю что уйдёт заряда больше чем за 15-20 минут работы какой нибудь требовательной игрушки.
Очень круто!
Только думаю, что все действительно можно соединить в одном полноценном приложении. И что-то мне подсказывает, что такие проги уже есть)
Только думаю, что все действительно можно соединить в одном полноценном приложении. И что-то мне подсказывает, что такие проги уже есть)
Вот крайне интересно читать о том, как программирование помогает «обычным людям» в решии их повседневных задач.+1 решение проблем — это самый кайф в нашем деле!
Уж очень специфичная штука, чтоб такое приложение уже было ) даже на PC готового нет. По отдельности — пожалуйста, но вот все вместе нет.
А у вас не было мысли запилить такое приложение? Мне кажется, среди фотографов было бы весьма востребованным.
Супер! Делитесь своим опытом, у вас прекрасно получается!!! Спасибо за столько интересный рассказ! Не думали оформить все либой и где-нибудь распространять за не бесплатно?
Спасибо. Нет, не думал. Программирование это хобби, основной доход другой.
Единственное, что, сделал коммерческий заказ на доработку софтины для коллеги, который занимается видео. Все тоже самое, но половину функционала не понадобилось, так как видео нужно склеивать напрямую, без какой либо обработки.
Единственное, что, сделал коммерческий заказ на доработку софтины для коллеги, который занимается видео. Все тоже самое, но половину функционала не понадобилось, так как видео нужно склеивать напрямую, без какой либо обработки.
Замечательное решение и отличная статья. Частенько вот сталкивался с мнением, де никак фотографу под Linux работать не удастся, мол фотошопа нет и тому подобное. А оно вон как получается, отличная автоматизация рабочего процесса.
Да, но без Windows, если занимаешься коммерческой съемкой, действительно очень сложно. Как раз таки из за фотошопе и тому подобное. Аналоги есть, но до коммерческого применения не дотягивают. С удовольствием поучаствовал бы, например, в работе над dark table, но не хватает времени (
Мне RawTherapee нравится. Правда фотки больше научного характера. Камера микроскопа, макрофотографии образцов со штатива…
Я не буду говорить про цвет, профили камер и объективов, это все субъективно.
Когда ты целыми днями работаешь с программой, любой косяк интерфейса или тормоза очень и очень мешают.
Пару фотографий обработать можно, но вот когда их сотни и тысячи (
Когда ты целыми днями работаешь с программой, любой косяк интерфейса или тормоза очень и очень мешают.
Пару фотографий обработать можно, но вот когда их сотни и тысячи (
Это всё же не работа фотографа получилась, а работа программиста.
О пригодности линукса для фотографа оно не говорит.
О пригодности линукса для фотографа оно не говорит.
Вы молодец! Ограничения всегда порождают продуманные и интересные решения.
Например, на очереди статья, как сделать вот такую милую и функциональную фотобудку
Можно карманный принтер к фотоаппарату синей изолентой примотать, дешево и сердито!
Шикарный пост!
У вас так понимаю Canon с карточками формата Compact Flash? Это к телефону картридер еще нужно подключать?
У вас так понимаю Canon с карточками формата Compact Flash? Это к телефону картридер еще нужно подключать?
Голосую за статью про фотобудку!
exiftool можно заменить на pyexiv2, больше возможностей и код проще
Спасибо, посмотрю на него еще раз — когда то у меня с ним не срослось, не помню почему.
Pillow кстати тоже может читать exif, но почему то не все теги и не всегда )
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)
Да, отличное решение с Linux Deploy! Сразу возникают мысли, как еще можно это использовать. Ведь в кармане у каждого лежит приличный компьютер да еще всегда подключенный к интернет. Можно и веб сервер с интернет магазином на нем развернуть. Хостинг открыть.
Даже биткоины можно потихоньку майнить :)
Даже биткоины можно потихоньку майнить :)
Круто, мощность смартфонов, о которой много говорится, реально используется в деле.
Объединять видео файлы можно так (https://trac.ffmpeg.org/wiki/Concatenate)
Объединять видео файлы можно так (https://trac.ffmpeg.org/wiki/Concatenate)
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
С mpg было проще через cat сделать. И наверняка быстрее, не знаю, что ffmpeg там с этим делает внутри )
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Linux в кармане — на службе у фотографа