Четвертая камера для съемки в инфракрасном диапазоне

Picamera

Получив в свои руки такой долгожданный инструмент, как фотокубики на базе Raspberry Pi, я не мог не попробовать реализовать относительно простую задачу по созданию  очередной камеры для съемки в инфракрасном диапазоне. Заодно поэкспериментировав с чувствительным к нажатию экраном. По сравнению с предыдущими моделями ожидалось получить небольшое увеличение разрешения и возможность использовать богатую коллекцию широкоугольных объективов, разместив фильтр за объективом.  Кратко перечислю возможности предыдущих моделей. Первая получилась, как побочный эффект использования линейки без фильтра в панорамной камере, в 2005 году. Вторая сделана на базе Casio QV 3000 в 2008 году. В ней использовалась оптика от дальномерных и зеркальных пленочных камер, что делало ее слишком длиннофокусной даже при использовании объектива Пеленг.  Третья, сделанная в 2012 году  на базе  Casio QV 4000 использовала штатный объектив и могла работать в режиме автофокуса. 
Кубики универсальны, и необходимый результат может быть достигнут разной их комбинацией. При конструировании камеры, предназначенной для серийного массового производства, мы будем стремиться избавиться от лишних возможностей отдельных блоков, повышающих стоимость. Платой за совершенство будет значительная сложность переделать или изменить конструкцию. Однако другая сторона медали состоит в том, что если крупные блоки выпускаются большой серией, как Raspberry Pi,  то, несмотря на значительную избыточность - типа, а зачем камере полноценная операционная система - стоимость блока оказывается дешевле, чем у узкоспециализированной модели. В данном контексте я попытался собрать камеру, используя миниатюрную камеру и систему смены фильтров. Это не оптимальное решение, поскольку от камеры я использовал только матрицу, от системы смены фильтров только крепление объектива с резьбой М12. Решение в значительной степени было спровоцировано обилием несовместимых по размерам узлов. Так, система смены фильтров не может быть установлена на стандартную picamera, поскольку расстояние под крепежные винты отличается на пару миллиметров.

picamera 

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

picamera

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

picamera

Система смены фильтров. Отсекающий ИК при подаче сигнала заменяется на нейтральный. Нам нужен не нейтральный, необходимый только для сохранения фокусировки, а фильтр, пропускающий только ИК.

picamera

К сожалению, имеющиеся у меня фильтры были слишком толстыми, и пришлось отказаться от возможности легко превращать ИК камеру в цветную. Вместо блока смены фильтров был установлен вырезанный по размеру фильтр Cokin P007 (89B).  

picamera

Поскольку камера создавалась до того как я стал обладателем 3D принтера, то корпус был сделан из пластмассового стакана для карандашей.

picamera
picamera

Вместе с экраном 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

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