Четвертая камера для съемки в инфракрасном диапазоне
Получив в свои руки такой долгожданный инструмент, как фотокубики на базе Raspberry Pi, я не мог не попробовать
реализовать относительно простую задачу по созданию
очередной камеры для съемки в инфракрасном диапазоне. Заодно
поэкспериментировав с чувствительным к нажатию экраном. По
сравнению с предыдущими моделями ожидалось получить небольшое
увеличение разрешения и возможность использовать богатую коллекцию
широкоугольных объективов, разместив фильтр за объективом.
Кратко перечислю возможности предыдущих моделей. Первая получилась, как побочный
эффект использования линейки без фильтра в панорамной камере, в
2005 году. Вторая сделана на базе
Casio QV 3000 в 2008 году. В ней использовалась оптика от
дальномерных и зеркальных пленочных камер, что делало ее слишком
длиннофокусной даже при использовании объектива Пеленг. Третья, сделанная в 2012
году на базе Casio QV 4000 использовала штатный
объектив и могла работать в режиме автофокуса.
Кубики универсальны, и необходимый результат может быть достигнут
разной их комбинацией. При конструировании камеры, предназначенной
для серийного массового производства, мы будем стремиться
избавиться от лишних возможностей отдельных блоков, повышающих
стоимость. Платой за совершенство будет значительная сложность
переделать или изменить конструкцию. Однако другая сторона медали
состоит в том, что если крупные блоки выпускаются большой серией,
как Raspberry Pi, то, несмотря на значительную избыточность
- типа, а зачем камере полноценная операционная система -
стоимость блока оказывается дешевле, чем у узкоспециализированной
модели. В данном контексте я попытался собрать камеру, используя
миниатюрную камеру и систему смены фильтров. Это не оптимальное
решение, поскольку от камеры я использовал только матрицу, от
системы смены фильтров только крепление объектива с резьбой М12.
Решение в значительной степени было спровоцировано обилием
несовместимых по размерам узлов. Так, система смены фильтров не
может быть установлена на стандартную picamera, поскольку
расстояние под крепежные винты отличается на пару миллиметров.
Родной объектив миниатюрной камеры, хотя теоретически может быть
вывинчен, однако скорее всего при этом отвалится его крепление
оправы с матрицей.
Сравнение стандартного и миниатюрного исполнений.
Количество деталей одинаково, но часть расположена не на плате, а
на шлейфе, ведущем к компьютеру.
Система смены фильтров. Отсекающий ИК при подаче сигнала
заменяется на нейтральный. Нам нужен не нейтральный, необходимый
только для сохранения фокусировки, а фильтр, пропускающий только
ИК.
К сожалению, имеющиеся у меня фильтры были слишком толстыми, и
пришлось отказаться от возможности легко превращать ИК камеру в
цветную. Вместо блока смены фильтров был установлен вырезанный по
размеру фильтр Cokin P007 (89B).
Поскольку камера создавалась до того как я стал обладателем 3D принтера, то корпус был
сделан из пластмассового стакана для карандашей.
Вместе с экраном Waveshare
3.2inch RPi LCD (B), 320×240 распространяется и программа
от Adafruit превращающаяся
Raspberry Pi в чисто автоматическую мыльницу. Однако автоматика не
учитывает наши специфические потребности и пришлось добавить
компенсацию экспозиции и фокусировку по увеличенному
фрагменту. Был у меня и чуть больший экран 4inch RPi LCD
(A), 320×480. К сожалению, с экранами большего размера программа
не работает. Простого способа согласовать чувствительность в этой
программе к нажатию с 4 дюймовым экраном я не нашел, поэтому
вынужден был ограничиться экраном 320х240. Полный текст
модифицированной программы можно скачать здесь.
С помощью утилиты сравнения файлов diff получаем:
@@ -197,9 +197,15 @@ def storeModeCallback(n): # Radio buttons on storage settings screen global storeMode - buttons[4][storeMode + 3].setBg('radio3-0') - storeMode = n - buttons[4][storeMode + 3].setBg('radio3-1') + #buttons[4][storeMode + 3].setBg('radio3-0') + #storeMode = n + #buttons[4][storeMode + 3].setBg('radio3-1') + +def expCallback(n): + global expMode + setexpMode((expMode + n) % len(expData)) + + def sizeModeCallback(n): # Radio buttons on size settings screen global sizeMode @@ -224,7 +230,7 @@ saveIdx = -1 # Image index for saving (-1 = none set yet) loadIdx = -1 # Image index for loading scaled = None # pygame Surface w/last-loaded image - +expMode = 3 # To use Dropbox uploader, must have previously run the dropbox_uploader.sh # script to set up the app key and such. If this was done as the normal pi # user, set upconfig to the .dropbox_uploader config file in that account's @@ -236,13 +242,16 @@ sizeData = [ # Camera parameters for different size settings # Full res Viewfinder Crop window [(2592, 1944), (320, 240), (0.0 , 0.0 , 1.0 , 1.0 )], # Large - [(1920, 1080), (320, 180), (0.1296, 0.2222, 0.7408, 0.5556)], # Med - [(1440, 1080), (320, 240), (0.2222, 0.2222, 0.5556, 0.5556)]] # Small + [(1440, 1080), (320, 240), (0.2222, 0.2222, 0.5556, 0.5556)], # Med + [(720, 540), (320, 240), (0.4, 0.4, 0.2, 0.2)]] # Small isoData = [ # Values for ISO settings [ISO value, indicator X position] [ 0, 27], [100, 64], [200, 97], [320, 137], [400, 164], [500, 197], [640, 244], [800, 297]] +expData = [ + [ -20, 60], [-12, 90], [-6, 120], [0, 150], + [6, 180], [12, 210], [20, 240]] # A fixed list of image effects is used (rather than polling # camera.IMAGE_EFFECTS) because the latter contains a few elements # that aren't valid (at least in video_port mode) -- e.g. blackboard, @@ -300,17 +309,17 @@ # Remaining screens are settings modes - # Screen mode 4 is storage settings + # Screen mode 4 is exposure settings [Button(( 0,188,320, 52), bg='done', cb=doneCallback), Button(( 0, 0, 80, 52), bg='prev', cb=settingCallback, value=-1), Button((240, 0, 80, 52), bg='next', cb=settingCallback, value= 1), - Button(( 2, 60,100,120), bg='radio3-1', fg='store-folder', - cb=storeModeCallback, value=0), - Button((110, 60,100,120), bg='radio3-0', fg='store-boot', - cb=storeModeCallback, value=1), - Button((218, 60,100,120), bg='radio3-0', fg='store-dropbox', - cb=storeModeCallback, value=2), - Button(( 0, 10,320, 35), bg='storage')], + Button(( 0, 70, 80, 52), bg='prev', cb=expCallback , value=-1), + Button((240, 70, 80, 52), bg='next', cb=expCallback , value= 1), + #Button(( 0, 79,320, 33), bg='iso-0'), + #Button(( 9,134,302, 26), bg='iso-bar'), + Button(( 150,157, 21, 19), bg='iso-arrow'), + #Button(( 0, 10,320, 29), bg='iso') + ], # Screen mode 5 is size settings [Button(( 0,188,320, 52), bg='done', cb=doneCallback), @@ -369,6 +378,15 @@ buttons[7][7].rect = ((isoData[isoMode][1] - 10,) + buttons[7][7].rect[1:]) +def setexpMode(n): + global expMode + expMode = n + camera.exposure_compensation = expData[expMode][0] + print n + #buttons[4][5].setBg('iso-' + str(isoData[expMode][0])) + buttons[4][5].rect = ((expData[expMode][1] - 0,) + + buttons[4][5].rect[1:]) + def saveSettings(): try: outfile = open('cam.pkl', 'wb') @@ -564,15 +582,15 @@ # Init pygame and screen pygame.init() -pygame.mouse.set_visible(False) +pygame.mouse.set_visible(True) screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN) # Init camera and set up default values camera = picamera.PiCamera() atexit.register(camera.close) camera.resolution = sizeData[sizeMode][1] -#camera.crop = sizeData[sizeMode][2] -camera.crop = (0.0, 0.0, 1.0, 1.0) +camera.crop = sizeData[sizeMode][2] +#camera.crop = (0.0, 0.0, 1.0, 1.0) # Leave raw format at default YUV, don't touch, don't set to RGB! # Load all icons at startup. @@ -614,6 +632,7 @@ # Refresh display if screenMode >= 3: # Viewfinder or settings modes stream = io.BytesIO() # Capture into in-memory stream + camera.crop = sizeData[sizeMode][2] camera.capture(stream, use_video_port=True, format='raw') stream.seek(0) stream.readinto(yuv) # stream -> YUV buffer
У трехдюймового экрана есть кнопки и в принципе можно вообще отказаться от возможностей чувствительного к нажатию экрана.
Возможно, это будет и удобнее. Подключив модуль WiFi, можно легко
реализовать дистанционное управление
камерой. Питание осуществляется от внешнего аккумулятора.
При работе с цветной матрицей фильтр Cokin P007 (89B) дает цветную картинку, в которой света имеют холодный оттенок, а тени теплый. Иногда это мне казалось выигрышным и я оставлял изображение без изменений, а иногда превращал в монохромное черно-белое. Примеры снимков в нижеприведенной галерее.
10.01.2016
Установите проигрыватель Flash
|
Облако тегов:
...
|