picamera python raspberrypi

HDRタイムラプス動画とHDR静止画で過去と現在の愛兎の様子を監視する(その1) #RaspberryPi #PiCamera #Python

kght6123

kght6123

HDRタイムラプス動画とHDR静止画で過去と現在の愛兎の様子を監視する(その1) #RaspberryPi #PiCamera #Python

我が家では、RaspberryPiにHomebridgeをインストールし、PiCameraを使って愛兎の様子を外出先でも見れる様にしています。

この方法は欠点があって、何故かHomebridgeが高頻度で「応答なし」になりますし、過去の様子が見れません。

(嫁のiPhoneはあまり応答なしにならないそうです、、、)

それに画質もあまり良く無いので、小さい生き物の様子をみるにはちょっと不十分ですし、たまたま部屋の暗いところに愛兎がいると、画質が悪いのと相乗効果であまり良く見えません。

そこで、ちょっと前からiPhoneなどスマートフォンで、白飛びや黒つぶれが少ないHDRの写真が撮れますが、

OpenCVでも簡単にHDR写真が作れるそうなので、試してみました。

今回は「その1」ということで、PythonにOpenCVやpicameraなど、必要モジュールのインストールと静止画の撮影を行いました。

まず、RaspberryPiにデフォルトでインストールされている、PythonとOpenCVのバージョンを調べ、aptでパッケージの有無を確認しました。

# Python3のバージョン確認
sudo apt-cache show python3
 Package: python3
 Source: python3-defaults
 Version: 3.5.3-1

python3 -V
 Python 3.5.3

# OpenCVのバージョン確認
sudo apt-cache show libopencv3
 N: Unable to locate package libopencv
 E: No packages found

sudo apt-cache show python-opencv
 Package: python-opencv
 Source: opencv
 Version: 2.4.9.1+dfsg1-2

sudo apt-cache show libopencv-dev
 Package: libopencv-dev
 Source: opencv
 Version: 2.4.9.1+dfsg1-2

sudo apt search opencv

sudo apt search libopencv3
 Sorting... Done
 Full Text Search... Done

sudo apt-cache show libopencv3
 N: Unable to locate package libopencv3
 E: No packages found

sudo apt-cache show libopencv
 N: Unable to locate package libopencv
 E: No packages found

今回は、なるべく新しいバージョンで開発したいと思っていますが、特にOpenCVがちょっと古いバージョンだったので、既存のOpenCVを削除して新たに3.4.2をインストールしました。

さらに、Python3のnumpyのバージョンが古かったので、pip3もインストールしてnumpyを更新しました。

Python2とPython3で新しいOpenCVがimportできるところまで確認しました。

# 削除
sudo apt-get autoremove libopencv-dev python-opencv
# パッケージリストを更新
sudo apt-get update

# OpenCV3をインストール
wget https://github.com/mt08xx/files/raw/master/opencv-rpi/libopencv3_3.4.2-20180709.1_armhf.deb
sudo apt install -y ./libopencv3_3.4.2-20180709.1_armhf.deb
sudo ldconfig

# python2で確認
python2 -c 'import cv2; print(cv2.__version__)'
 3.4.2

# python3のnumpyをインストール
sudo apt-get install python3-pip
pip3 -V
 pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.5)

pip3 install numpy --upgrade # 10分ぐらいかかる
 Successfully installed numpy-1.15.0

# python3で確認
python3 -c 'import cv2; print(cv2.__version__)'
 3.4.2

次に、pipを使ってpicameraをインストールします。

インストール前にファームウェアのバージョンを確認します。

uname -a
 Linux pi3j 4.14.50-v7+ #1122 SMP Tue Jun 19 12:26:26 BST 2018 armv7l GNU/Linux
# #707以上を確認

pip3 install picamera # picamera-1.13がインストールされた
python3 -c 'import picamera;' # importを確認

これで、必要モジュールのインストールは完了です。

ffmpegでタイムラプス動画を作る見込みなので、ffmpeg(できればハードウェアエンコーダー含む)も事前に入れておきます。

あとはこんな感じで、PiCameraがPythonからコントロールと撮影できることを確認します。

import io

import cv2
import numpy as np

from time import sleep
from fractions import Fraction
import picamera

# execute command
#  python3 save_pi_hdr.py

# Create the in-memory stream
stream = io.BytesIO()

with picamera.PiCamera() as camera:
  camera.resolution = (1280, 720)
  camera.awb_mode = 'auto'
  camera.drc_strength = 'high'
  sleep(0.5)
  camera.capture(stream, use_video_port=False, format='jpeg', quality=85, bayer=True, thumbnail=(64, 48, 35))
  
  # to OpenCV
  # Construct a numpy array from the stream
  data = np.fromstring(stream.getvalue(), dtype=np.uint8)
  # "Decode" the image from the array, preserving colour
  image = cv2.imdecode(data, 1) # 0=gray,
  cv2.imwrite('photo9.jpg', image)
  pass

次はHDR写真を作るために、露出を変えて何回も撮影します。