Оцифровка 8 мм кинофильмов с помощью Raspberri Pi

Picamera

С этого все началось, этим, возможно, и закончится

В феврале 1999 года я опубликовал статью Оцифровка 8 мм кинофильмов. Свою задачу та установка решала, однако процесс оказался столь трудоемким, что за 15 лет я так и не оцифровал свой киноархив. Удачных самодельных или промышленных устройств для решения этой задачи я за это время тоже почти не видел. Только на выставке Фотокина в 2010 году на стенде фирмы Kunee Instruments была показана аппаратура для оцифровки любительской кинопленки, которая на мой взгляд идеологически была очень близка к моей самоделке 1999 года. Поэтому идея модернизировать старую установку с помощью современной электроники показалась очень заманчивой. Задача стояла получить максимальное качество, чтобы больше к этому вопросу не возвращаться, и с разумной скоростью. Т.е. скорость оцифровки должна была быть близкой к скорости просмотра фильма на экране. Народная мудрость гласит, что креститься надо, когда кажется. Увы, этот метод не работает у безбожников и задача оказалась достаточно трудоемкой. Ее воплощение в жизнь растянулось на два месяца. Поскольку эпоха 8 мм кинопленки уже необратимо завершилась, то начну с краткого описания.

8-мм киноплёнка

Киноплёнка N8 (Cine Kodak Eight) разработана фирмой Eastman Kodak в 1932 году. Съемка ведется на кинопленку «2х8 мм», которая представляет собой 16-мм кинопленку с перфорацией уменьшенного вдвое шага. Сперва снимается одна сторона, потом пленка переворачивается и снимается вторая сторона. После проявки пленка разрезается пополам. В 1965 году фирмой Eastman Kodak разработан формат «8 Супер» и постепенно пленка «2х8 мм» полностью вышла из употребления. Пленки в моем архиве сняты в конце 60х начале 70х годов прошлого века. В СССР выпускались камеры с разными возможностями и ценой. На фото ниже представлены два полюса: дешевая Спорт и дорогая Кварц. Как и в случае с современными часами, механическая Кварц дороже, чем электрическая Спорт.

Спорт и Кварц 2м

Камера Спорт выпускалась ЛОМО в 1960-1962 годах. Камера Кварц 2М выпускалась КМЗ в 1963-1968 годах.

Спорт и Кварц 2м

Сопряжение курка рукоятки с камерой Спорт осуществлялось с помощью стандартного тросика, который на фотографии отсутствует.

Спорт

Электромотор и место для плоской батарейки в камере Спорт. Скорость только одна - 16 кадров/с.

Кварц 2М

Механическая камера Кварц 2М. Скорость съемки 8, 12, 16, 24, 32, 48 кадр/с, покадровая съемка, ручная обратная отмотка плёнки. Комплектовалась афокальными насадками с байонетным креплением на объективе.

Кварц 2М

Объектив Ю-24М 1,9/12,5

Кварц 2М
Спорт

резак 2х8 мм

Кинопленка 8 мм

На данной фотографии приведены реальные размеры одной из моих пленок, снятых камерой Кварц 2М. Размеры и шаг перфорации стандартные, а вот размер кадра чуть больше стандартного 4,9 х 3,55 мм и будет обрезан рамкой фильмового канала проектора.

Переделка оптической части проектора

Оптический тракт проектора состоит из двух частей: осветительной и проекционной. Осветительная состоит из лампы, конденсора, призмы и матового стекла, выполняющего попутно и роль теплофильтра. Лампа была сразу заменена на белый светодиод, а матовое стекло - теплофильтр на простое качественное матовое стекло. Однако этого оказалось недостаточно, поскольку светодиод это точечный источник с линзой, а лампа - это довольно большая площадка, образованная спиралью. Для получения более или менее равномерного освещения всего кадра линзу светодиода  необходимо крыть матом, пока площадь не возрастет до размера спирали. Эта процедура осуществляется  с помощью мелкой шкурки.

Лампа 12 В 90 Вт
ЛОМО Н-2 F-18/1,4
Лампа 12 В 90 Вт
ЛОМО Н-2 F-18/1,4
конденсор

Как и в модели 1999 года, был демонтирован обтюратор. На следующей фотографии представлены демонтированные узлы проектора.

демонтированные узлы проектора

Размер матрицы камеры 3,76х2,74 мм. Это чуть меньше размера кадра и в начале я попытался использовать родной объектив проектора ЛОМО Н-2 F-18/1,4, повернув его на 180 градусов. Однако результат напоминал снимок моноклем: ореолы и двойная точка фокусировки, когда мы имеем либо четкую картинку с ореолами, либо нерезкую без. При отсутствии диафрагмы исправить положение не представлялось возможным, потому было принято решение заменить объектив. Теоретически для этих целей подходил любой нормальный объектив. В идеале с фокусным расстоянием 20-35 мм. Сменные объективы с таким фокусным расстоянием оказались большой редкостью и я воспользовался тем, что было объективами к Зениту с резьбой М42. Нормальные объективы для формата 24х36 мм - это объективы с фокусным расстоянием вблизи 50 мм. Самые распространенные из них Тессары - Индустары. Учитывая довольно большой диаметр оправы, желание использовать более короткофокусные объективы отпало, поскольку разместить их мешал бы корпус проектора. У меня было три практически одинаковых объектива но, чуть в разной оправе: Индустар 50-2 от КМЗ, венгерский YMMAR с резьбой М42 и Carl Zeiss Tessar с байонетом Exakta. Оправы, однако, у них отличались весьма существенно. У Индустара 50 резьба светофильтра вращается при изменении диафрагмы, у YMMAR - при вращении кольца фокусировки и только у Carl Zeiss Tessar она не связана ни с кольцом диафрагмы, ни с кольцом фокусировки. Однако изготовление байонета требовало существенно больших усилий, чем нарезание резьбы М42, и в результате я остановил свой выбор на YMMAR.

Индустар 50-2, YMMAR, Carl Zeiss Tessar

Для крепления объектива к проектору был изготовлен тубус, заканчивающийся резьбой светофильтра, а для крепления камеры было изготовлено несколько переходных колец Они обеспечивали как необходимую дистанцию до камеры, так и ее юстировку относительно оптической оси. Одно кольцо позволяло вращать камеру, а другое, с 3 юстировочными винтами, смещать ее центр. Точная подгонка масштаба не предусматривалась, так как матрица имела большой запас по разрешению и удобнее было видеть при настройке кадр вместе с полями, а потом программно обрезать все лишнее. Тем более, что программное обеспечение позволяло это делать налету во время съемки. Расстояние от опорной поверхности объектива до матрицы 83 мм. Расстояние от пленки до матрицы - 203 мм.

Picamera
Picamera

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

оптопара

Управлять высоковольтным двигателем переменного тока задача не самая приятная, и я решил его заменить на что-нибудь, чем Raspberry Pi может управлять через стандартный контролер без особого риска сгореть.

Переделка электромеханической части проектора

Сперва я попытался установить шаговый двигатель от принтера Epson и снимать покадрово, давая команду провернуть вал на один кадр, однако, оказалось, что на больших оборотах мощность двигателя катастрофически падает и он не способен обеспечить скорость съемки больше двух кадров в секунду. В Epson Stylus Photo EX были только шаговые двигатели, однако потом в моделях Stylus Photo 870 один из шаговых двигателей заменили на коллекторный постоянного тока марки OEM316 RS545. Им я и решил воспользоваться, подключив его к Raspberry Pi через контроллер на микросхеме L298N.

L298N

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



Программное обеспечение процесса съемки

Общие соображения

Съемка последовательности кадров с необходимым нам разрешением в 1 Мп и скоростью 16 кадров в секунду с помощью Raspberry Pi возможна в двух режимах: покадровая съемка с использованием видеобуфера и съемка видео.

capture_sequence(outputs, format='jpeg', use_video_port=True, quality )

start_recording(output, format, intra_period)

Вариантов организации синхронизации также возможно несколько.

1) Синхронизация по таймеру скорости вращения мотора для обеспечения частоты смены кадров заданной для съемки. Плюсом данного решения является то что мы используем максимально мощность мотора, поскольку обеспечивается равномерное вращение без торможения после каждой смены кадра. Минусом данного решения является то, что частота съемки чуть отличается от декларируемой и набегающая ошибка приводит к тому что через некоторое время мы начинаем снимать в момент смены кадров грейферным механизмом. Проблема для интервала порядка 5 минут фильма решается поправочным коэффициентом. Для съемки в режиме видео это позволило мне снимать со скоростью 13 кадров в секунду.

Пример кода синхронизации:

camera.start_recording('my_video%02d.h264' % film)
dtf= 0.98535/fram
start = time.time()
while flag2 == 0:
     while flag1 == 0:
           GPIO.output(17, 1)
     GPIO.output(17, False)
     flag1=0
     fin = time.time()
     while fin <= start +dtf*j:
           fin = time.time()

где dtf - реальный интервал при заданной частоте кадров, flag1 - сигнал с оптопары, связанной с грейферным механизмом, flag2 - сигнал с кнопки завершения съемки, GPIO.output(17, 1) - включение двигателя.

2)Синхронизация по сигналу камеры, вызываемому командой frame.index о заполнении буфера очередным кадром. Плюс в том, что ошибка не накапливается во времени. Минус - момент заполнения буфера не точно соответствует моменту экспозиции. При равномерном вращении двигателя заметно, что сигнал поступает с разными интервалами. Если мы даем команду двигателю на следующий оборот, дождавшись сигнала о заполнении буфера, то он работает в режиме старт стоп, что приводит к сильному его нагреву и уменьшению максимальной возможной скорости съемки. Кроме того, при записи в формате h264 сигнал подается при записи всех кадров. А понятие кадров здесь существенно отличается от кино. Есть i-кадры и p- кадры. Как написано в описании команды: As a consequence, this attribute cannot be used to detect dropped frames. Nor does it necessarily represent actual frames;

В дальнейшем я видеокадры буду именовать frame. Т.е запись i-frame это дополнительная запись, которая не соответствует съемке нового кадра. В автоматическом режиме камера записывает i-frame примерно каждый 60 кадр. Возможное решение - это отказаться от записи i -frame и задав intra_period = 0 или установить интервал равным 1 тогда на каждый кадр камера будет рапортовать о записи двух. Можно позволить камере вставлять i-frame в автоматическом режиме и считать, что если счетчик снятых полей больше, чем счетчик показанных кадров, то это i-frame, и этот отсчет надо игнорировать при синхронизации. С данным мотором система работает относительно стабильно при скоростях ниже 7 кадров в секунду. Более мощный двигатель, который позволит увеличить скорость смены кадров и соответственно паузу, когда с мотора снято напряжение, возможно, позволит поднять скорость. Съемка с записью в формате mjpeg, где все кадры ключевые, оказалась сначала мало работоспособной - в случае версии picamera 1.8 программа записывает 1 кадр в jpeg и камера виснет до перезагрузки. После обновления до версии 1.9 возможность работать в этом формате появилась, но принципиального улучшения при этом методе синхронизации это не дало, возникали задержки, вызванные, вероятно, большими по размеру файлами, и счетчик сбивался в районе 500 кадра при скорости 13 кадров в секунду. Как и формат h264, этот формат показал лучшие результаты в режиме синхронизации по времени.

Пример кода синхронизации:

camera.start_recording('my_video%02d.h264' % film) 
while flag2 == 0:
cfi=camera.frame.index
if cfi>j:
j=cfi
while flag1 == 0:
GPIO.output(17, 1)
GPIO.output(17, False)
while cfi <=j:
cfi=camera.frame.index
j=j+1
flag1=0

3) синхронизация вращения при покадровой съемке с моментом записи в файл. Когда происходит обращение к подпрограмме которая задает номер очередного кадра, то прежде чем ответить, мы заставляем ее ждать, пока мотор сменит кадр на следующий. Проблема в том, что запись в файл - это не момент съемки, и данный алгоритм работает только при скоростях меньших 7 кадров в секунду.

Пример кода синхронизации:

def motorob(): 
global flag1
GPIO.output(27, 0)
GPIO.output(22, 1)
GPIO.output(17, 1)
while flag1 == 0:
a =1
GPIO.output(17, False)
flag1=0
def filenames():
frame = 0
while flag2 == 0:
yield 'image%04d.jpg' % frame
frame += 1
motorob()
def selcam():
global flag2
flag2=0
camera.crop = (0.05,0.05,0.90,0.90)
camset()
camera.capture_sequence(filenames(), use_video_port=True, quality=75)

Практическая реализация

Написана программа на Python 2.7.3 с библиотекой picamera 1.8(1.9) и графическим интерфейсом на Tkinter. Управлять программой можно как с помощью мыши, подключенной к Raspberry Pi, так и с удаленного компьютера или телефона через tightvncserver. Запуск программы командой:

pi@raspberrypi ~ $ gksu python tkpicammkf6big2.py

Для выхода из полноэкранного режима просмотра, при котором графический интерфейс не виден, служит дополнительная кнопка, подключенная к GPIO разъему Raspberry Pi. Она же служит для прерывания записи, при которой графический интерфейс недоступен. Программа позволяет просматривать изображение с полями, обрезанное как при записи, увеличенные фрагменты для точной фокусировки по центру и с правого и левого краев кадра. Можно изменять выдержку, чувствительность, баланс белого и частоту кадров съемки. Обычно оцифровка ведется при ISO-100 и выдержке 1/500 с. Диафрагма F:4. Можно включить автоматическое определение выдержки, задав выдержку равной 0. В графическом интерфейсе это выбор в меню exposure_mode пункта none. Для черно-белых пленок может быть принудительно задан режим градаций серого галочкой в поле B&W графического интерфейса. В этом случае выполняется команда: camera.color_effects=(128,128). В случае цветных пленок баланс белого может быть задан выбором одного из стандартных вариантов, либо задан командой: camera.awb_gains=1.2, где коэффициенты усиления в красном и синем каналах подбираются экспериментально для конкретного светодиода. Эти коэффициенты не доступны из графического интерфейса и записываются в тексте программы. Режим включается выбором в меню white-balance пункта off. Библиотека picamera позволяет задать динамический диапазон яркость и контраст командами:

camera.drc_strength = 'high'
camera.brightness = 40
camera.contrast = -20

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

Возможна съемка отдельного кадра, серии нумерованных кадров и видео. Есть возможность ускоренной перемотки вперед и назад с предпросмотром без синхронизации. С данным мотором максимальная скорость не сильно превышает съемочную и примерно равна 16 кадрам в секунду. Отсутствие синхронизации приводит к тому, что мы периодически видим смену кадров. При съемке демонстрируются только снятые кадры и в случае сбоя синхронизации останавливаем съемку. Реализован первый вариант с синхронизацией по времени при съемке в режиме видео и третий в режиме покадровой съемки. Для контроля по окончанию записи выводится число снятых кадров и число дополнительных полей. Я полагаю, что это i-frame.

меню

Съемка ведется с разрешением 1024 х 768 пикселей. Этого более чем достаточно для большинства черно белых пленок. На мой взгляд, только отдельные статичные кадры, снятые на мелкозернистую пленку со штатива, могут потребовать такого разрешения. В большинстве случаев за счет длительных выдержек резкость кадра такого разрешения не требует. Но учитывая необходимость неоднократного перекодирования, я считаю такое разрешение оправданным. Разрешение цветной пленки ORWO существенно ниже, а про советскую цветную можно сказать, что и 320х240 для нее много.

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

Управление мотором осуществляется через контролер на базе микросхемы L298N. Используются три сигнальных провода, поскольку было замечено, что если использовать только два и держать enable всегда замкнутым на 5 В с помощью перемычки, то мотор греется сильнее. Напряжение питания мотора 24 В определяется в данном случае имеющимся у меня трансформатором. Возможно, напряжение можно поднять и тем самым увеличить скорость съемки. Логическая часть контроллера питается от Raspberry Pi.

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

Исходный текст программы можно скачать здесь.

Финальная обработка

Если ведется съемка в виде последовательных кадров, то они объединяются в фильм с помощью программы Avidemux. В ней же задается и частота в 16 кадров в секунду.

Если ведется видеосъемка с аппаратным кодированием h264, то полученный фильм мне удается просмотреть только в программе VLC причем с частотой 25 кадров в секунду вне зависимости от того, какая частота кадров была задана. Первое найденное решение проблемы - воспользоваться конвертером потокового видео, входящую в программу VLC. В какой формат перекодировать - вопрос спорный. Форматов без сжатия конвертер не поддерживает, не поддерживает он и смены частоты кадров воспроизведения. Т.е. при смене частоты в конвертере сохраняется время воспроизведения, а не все кадры воспроизводятся с новой частотой. Поэтому я записываю в формате mgpeg и затем в программе Avidemux изменяю частоту кадров, не перекодирую изображение и наконец в видеоредакторе Kdenlive монтирую фильм и сохраняю его в формате, пригодном для воспроизведения в интернете. Если финальный монтаж осуществлять в Blender, то изменение частоты кадров в Avidemux можно пропустить. Формат mgpeg достаточно удобен для вырезания отдельных кадров, которых набегает довольно много. Это и склейки пленки, и смены сцен, при которых первый кадр часто экспонируется с увеличенной выдержкой. Позже было найдено, возможно, более удобное решение с помощью ffmpeg:

bash-4.1$ ffmpeg -i inpvideo.h264 -vcodec copy outvideo.mp4

Можно сразу изменить и частоту кадров:

bash-4.1$ ffmpeg -r 16 -i inpvideo.h264 -vcodec copy outvideo.mp4

Полученный файл открывается как в Blender так и в Kdenlive.

Съемка с записью в формате mjpeg оказалась сначала неработоспособной - в случае версии picamera 1.8 программа записывает 1 кадр в jpeg и камера виснет до перезагрузки. После обновления до версии 1.9 полученный фильм читает только Mplayer и размер файла возрастает в 5 раз по сравнению с h264. Avidemux падает при попытке открыть файл. В Kdenlive файл можно отредактировать, но с плясками с бубном. Надо открыть проект с частотой 26 кадров в секунду и в него загрузить клип в формате mjpeg (предложив показать все файлы), после этого откорректировать длительность, чтобы она совпадала с числом снятых кадров. Отредактировать, сохранить и затем в Avidemux изменить скорость проекции на 16 кадров в секунду. Очевидно, что описанные методы из серии чесать левой рукой правое ухо. Поскольку очевидно, что и Mplayer и Kdenlive используют ffmpeg, то логично сразу ей и воспользоваться для перезаписи файла в читаемый формат без перекодирования:

bash-4.1$ ffmpeg -i inpvideo01.mjpeg -vcodec copy outvideo01.avi

Можно сразу изменить и частоту кадров:

bash-4.1$ ffmpeg -r 16 -i inpvideo01.mjpeg -vcodec copy outvideo01.avi

Большинство 8 мм фильмов представляют собой семейную хронику и интересны только их владельцам. Однако уличные съемки конца шестидесятых - начала семидесятых дают представление об эпохе: одежде, количестве автомобилей на улицах их марках, поэтому именно эти съемки я и привожу для иллюстрации работы установки.

Москва. Ленинский проспект, Универмаг Москва в конце 60х годов.

Выборг начала семидесятых. В фильме есть кадры со съемочной площадки фильма «Крах инженера Гарина», что позволяет датировать этот фильм 1972 или 1973 годом. Премьера фильма была в октябре 1973 года, так что вероятнее 1972 год.

5.02.2015
Установите проигрыватель Flash

Облако тегов:
3D печать
Arduino
Raspberry Pi
Аэрофотосъемка
Байдарки
Геомеханика
История
Камеры
Макросъемка
Объективы
Освещение
Панорамы
Принадлежности
Принтеры
Программы
Сканеры
Стереосъемка
Фильтры
Фокусировка
Фотокубики
...
rss