ケロロ好きなエンジニアのブログ

サラリーマンエンジニアの電子工作のことをメインに書いていきたいけど電子工作はまとまった時間がないとなかなか難しいから滅多に書けそうもなくてMVNOの話題がメインになりつつあるブログ

2013年9月にseesaaより移転してきましたので、それ以前の記事はうまく読めない場合があります。

RaspberryPi事始め 8.カメラをプログラムから使ってみる

にほんブログ村 スマホ・携帯ブログへ にほんブログ村 スマホ・携帯ブログ 格安SIMカード・MVNOへ

スポンサーリンク

カメラ表示ですが、先日はコマンドラインから試してみました。

 

今度はプログラムから使ってみようと思います。

 

このオフィシャルサイトを見ながら進めてみます。

Getting started with picamera - Introduction | Raspberry Pi Projects

 

ここではPythonを使った説明になってます。

私はPythonは超初心者レベルですが見よう見まねで使ってみようと思います。

 

 

ラズパイをDVIで表示する

その前にHDMI表示ですが、WindowsPC用のモニタのHDMI入力をラズパイに接続して使ってましたが、WindowsPCの方がDVI接続となり解像度がMaxでもFullHDという不便さがあるだけじゃなくて、nasneの映像がHDCPの関係で見れないという超不便さがありました。

なので、この変換アダプタを使ってラズパイをDVI入力にいれてHDMIはWindowsPCに返しました。

f:id:keroctronics:20180820230659p:plain

HDMIケーブル+HDMI→DVI変換アダプタです。問題なく表示されました。信号自体は一緒ですもんね。

この変換アダプタ ATIって書いてあるんで、前に買ったRadeonのグラフィックカードについてきたものかな?

買っても安いですね。

 

Python起動

まずは

プログラミング > Python3(IDLE) を起動します。

Python 3.5.3のShellが立ち上がりました。

f:id:keroctronics:20180820231024p:plain

ここから File > New File でエディタが立ち上がりました。

 

 

これが開発環境ってことですかね。エディタですが、実行もできます。

 

Camera preview

そのエディタ内に以下のソースを打ち込んで camera.py でセーブ。

from picamera import PiCamera
from time import sleep

camera = PiCamera()

camera.start_preview()
sleep(10)
camera.stop_preview()

そしてRun で実行してみます。

 

ライブ画像が10秒ほど見れました。

前回書いたように、VNCからでは見えないので本体に直接モニタを接続してあげないといけませんのでご注意を。

 

Python素人でもソースを見たらまぁわかりますかね。最初のおまじないだけはそういうものだとして、その後、previewをStartして10秒まってpreviewをstopする。

まぁ簡単な動作かと思いますが、たったこれだけでライブカメラプログラムが書けたっていう事でもあるのでなんて楽なんだろう!って感じです。

 

で、次はpreviewの前に

camera.rotation = 180

 を入れてみます。

想像つくと思いますが、そのとおりの結果になります。

 

現在のこのスタイルには180°ローテーションした方があってますね。

f:id:keroctronics:20180814154955p:plain

 

180°ってのは1°づつ変えられたら回転ができてすごーいってなるんですが、さすがにそれはできないようで、0/90/180/270と90°単位でしか回転できません。

90°回転しても横長の画面出力は変わりません。引き伸ばしてるとかじゃなくてクロップしているようですね。

ここで、start_preview()の後にrotationを入れてみた所問題なく切り替わりました。

っていうかエディタ上に書かなくても最初に立ち上がったウィンドウで直接書いてもいけますよ。

 

 

さて、次は

camera.start_preview(alpha=200)

と、アルファを設定してみます。

1枚の画像でアルファってどうなるのよ?って思いましたが、なるほど透けてデスクトップが見えるわけですね。なかなか幻想的な画になります。

alphaは8bitらしく0〜255が設定できるようです。

 

でも、このような書き方だとpreview中にalpha変えるのはどうするんでしょうね。

Still pictures

次は静止画をキャプチャする方法です。

これも簡単で撮りたいところで、camera.capture() を書くだけです。

ファイル名は()の中に入れるので、

camera.capture('/home/pi/Desktop/image.jpg')

って感じになります。

ただ、キャプチャを実行するのに2秒程度かかるようです。

光のレベルをセットする時間だそうで、露出計算とかしてるんでしょうかね。

 

ちなみにファイル名書かなかったらどうなるのかな?って試してみたらエラーでした。

 

キャプチャされた画像はデスクトップ上に表れますのでそれをクリックすればデフォルトのビューワで見れます。

 

で、forループで以下のように書くと連続キャプチャになります。

for i in range(5):
    sleep(5)
    camera.capture('/home/pi/Desktop/image%s.jpg' % i)

これで image0.jpg 、image1.jpg … って出来ます。

forループの書き方だったり、:だったりインデントでブロックを表すってのがPythonのようです。

それはともかく、%sの部分にiの数字が入るってのがわからない。

sprintf的な感じかな?って思うんですが、% i って書くのってどういうこと?%って何?ってのが不明。いずれPythonは勉強しないとな。

 

先日買ったこの本は届いているんですがまだ読んでないし。。。読まないとスラスラわかりませんよね。

まぁとりあえず今はそういうもんだってことで流しておきます。

Recording video

静止画の次は動画ですね。

これもシンプルです。

camera.start_preview()
camera.start_recording('/home/pi/video.h264')
sleep(10)
camera.stop_recording()
camera.stop_preview()

と、preview中にrecordingのstartとstopを入れるだけ。 

 

動画を見るのはカメラを使ってみるってところでコマンドラインでキャプチャした動画を見た時のように omxplayer を使います。

 

なのでターミナルを起動させる必要がありました。

ターミナルのデフォルトディレクトリは/home/pi なので先のstart_recordingのファイルパスにはDesktopを入れてなかったわけです。

 

ただ、再生させたら早送り表示されました。録画データと表示速度があってないってことですかね。

どうすれば普通速度で表示されるのかなぁ?

 

Effects

解像度の設定です。

camera.resolution = (2592, 1944)
camera.framerate = 15

をcamera.start_preview() の前に入れるだけですね。 

これは静止画のMax値で、動画時はFullHDの1920,1080がMaxのようです。

ちなみに最低解像度は64x64です。

ただ、勝手にズームはするようです。どんな解像度にしても縦方向に目一杯表示しようとしてくれます。

違うパラメータをいじらないといけないようですね。

 

OSD表示

camera.annotete_text = "Hello world!"

 

明るさ設定

camera.brightness = 70

設定値は0〜100。デフォルト50

 

コントラスト設定

camera.contrast = 50

設定値は0〜100。デフォルト50

 

エフェクト設定

camera.image_effect = 'colorswap'


AWB(AutoWhiteBalance)設定

camera.awb_mode = 'sunlight'

 

露出設定

camera.exposure_mode ='auto' 

 

と、公式サイトではこの位の紹介になってますが、実際にはPicamera()には色々とあるようです。

以下のドキュメントが参考になりそうです。

10. API - picamera.camera Module — Picamera 1.10 documentation