サイトアイコン Unity+AssetStoreおすすめ情報

ラズパイ(RaspberryPI)でカメラを装着して、GUIにより操作する。

はじめに

Hololens と言う AR(MR)デバイスにてカメラを占有するアプリを作ると、録画が出来ないのが不便だったので RaspberryPI の外部カメラを使ってメガネの目部分に装着して操作できるようにした物を作成したのでご紹介させていただきます。

構成

機能概要

シンプルに以下のような機能

使用ライブラリ

Python2 を利用しております、理由は wxPython が Python3 だとインストールがめんどくさそうだったためです。

ソースコード

import os
import wx
import time
import picamera

# from screeninfo import get_monitors
# for m in get_monitors():
#    print(str(m))

class MyFrame(wx.Frame):

    def __init__(self):
        # common
        (w, h) = wx.DisplaySize()
        font = wx.Font(18, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
        wx.Frame.__init__(self, None, -1, "Camera Control", pos=(0,0), size=wx.DisplaySize(), style=wx.STAY_ON_TOP)
        # btnRecord
        self.btnPhoto = wx.Button(self, -1, "Pht", size=(80, 80))
        self.btnPhoto.Bind(wx.EVT_BUTTON, self.OnPhotoButton)
        self.btnPhoto.SetFont(font)
        # btnRecord
        self.btnRecord = wx.Button(self, -1, "Rec", size=(80, 80))
        self.btnRecord.Bind(wx.EVT_BUTTON, self.OnRecordButton)
        self.btnRecord.SetFont(font)
        # btnZoom
        self.btnZoom = wx.Button(self, -1, "Zoom", size=(80, 80))
        self.btnZoom.Bind(wx.EVT_BUTTON, self.OnZoomButton)
        self.btnZoom.SetFont(font)
        # btnClose
        self.btnClose = wx.Button(self, -1, "Close", size=(80, 80))
        self.btnClose.Bind(wx.EVT_BUTTON, self.OnCloseButton)
        self.btnClose.SetFont(font)
        # lblText
        self.lblText = wx.StaticText(self, wx.ID_ANY, '')
        self.lblText.SetFont(font)
        # Sizer
        panel = wx.Panel(self, size=(1,1))
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.lblText)
        sizer.Add(self.btnPhoto)
        sizer.Add(self.btnRecord)
        sizer.Add(self.btnZoom)
        sizer.Add(self.btnClose)
        panel.SetSizer(sizer)
        # Camera
        self.camera = picamera.PiCamera()
        self.camera.vflip = True
        self.camera.hflip = True
        self.camera.start_preview(fullscreen=False,window=(85, 15, w - 100, h + 40))
        # Flg
        self.isRecord = False
        self.isZoom = False

    def OnPhotoButton(self, event):
        self.Photo()

    def OnRecordButton(self, event):
        self.isRecord = not self.isRecord
        if self.isRecord == True:
            self.btnRecord.SetLabel('Stop')
            self.Record()
        else:
            self.btnRecord.SetLabel('Record')
            self.Stop()

    def OnZoomButton(self, event):
        self.isZoom = not self.isZoom
        if self.isZoom == True:
            self.camera.zoom = (0.2, 0.2, 0.6, 0.6)
        else:
            self.camera.zoom = (0.0, 0.0, 1.0, 1.0)

    def OnCloseButton(self, event):
        if self.isRecord == True:
            self.Stop()
        self.camera.stop_preview()
        self.camera.close()
        self.Close()

    def Photo(self):
        self.lblText.SetLabel('take photo...')
        self.camera.capture('photo.jpg')
        os.system('mv photo.jpg Desktop/photo.jpg')
        self.lblText.SetLabel('take photo...ok')

    def Record(self):
        self.lblText.SetLabel('recording...')
        self.camera.start_recording('movie.h264')

    def Stop(self):
        self.lblText.SetLabel('output...')
        self.camera.stop_recording()
        # print('start...')
        os.system('MP4Box -fps 30 -add movie.h264 movie.mp4')
        os.system('rm movie.h264')
        os.system('mv movie.mp4 Desktop/movie.mp4')
        self.lblText.SetLabel('output...movie.mp4')
        # print('end')

if __name__ == '__main__':
    app = wx.PySimpleApp()
    MyFrame().Show()
    app.MainLoop()

まとめ

Picamera で表示したカメラのプレビュー画面を画面上に微調整するのが結構めんどくさかった。(wxPythonのウィンドウとして扱えれば楽だったがそれが出来なかったので泥臭くそれっぽい場所になるように調整をしています)

録画・停止が画面操作でできるので非常に便利(*’▽’)

モバイルバージョンを終了