Raspberry Piの公式カメラには様々な種類があります。オリジナルのバージョン1.3から最新のRaspberry Pi HQカメラまで、すべて同じソフトウェアを使用しています。raspistillコマンドとraspividコマンドを使えば、ターミナルから直接静止画や動画を撮影できます。
より高度な用途としては、画像や動画のホワイトバランス、色、彩度、明るさを手動で調整することなどが挙げられます。また、たった1行のコードでシンプルな動画ストリーミングサービスを構築することも可能です。
Raspberry Piカメラのセットアップ
Piカメラモジュールのセットアップ方法を既にご存知の方は、先に進んでください。これらの手順は、サードパーティ製を含むすべてのRaspberry Piカメラモジュールで使用できます。
Raspberry Piの電源をオフにした状態。
1.プラスチックロックをゆっくりと上に持ち上げて、 カメラポートを開きます。
2.青いタブを USB/イーサネット ポートに向けて リボン コネクタを挿入します。
Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。
3.コネクタのロックを閉めて軽く引いて、確実に固定されていることを確認します。
4. Raspberry Pi の電源を入れ、「Preferences」>>「Raspberry Pi Configuration」に移動します。
5. 「インターフェース」タブにあるカメラの「有効化」ボタンをクリックします。
6. 「OK」をクリックして、Piを再起動します。
7.ターミナルを開き、次のコマンドを入力して、カメラをテストするための簡単な写真を撮ります。
$ raspistill -o test.jpg
5秒経過すると画像が撮影され、test.jpg として保存されます。ファイルマネージャーを使用して、画像が正しいことを確認してから次に進んでください。
ストリームのテスト
ストリーミングを開始するには、ターミナルを開いてかなり長いコマンドを入力する必要があります。Raspberry Piがネットワークに接続されていることを確認してください。最高のパフォーマンスを得るには、イーサネットケーブルを使用してください。Wi-Fiでも動作しますが、接続が途切れる場合があります。
1. Raspberry Piのホスト名を取得します。ターミナルを開き、このコマンドを入力してホスト名を取得します。ホスト名をメモしておいてください。ネットワークによっては、末尾に「.local」を追加する必要がある かもしれません。
$ hostname
2.ストリーミングコマンドを実行します。カメラからのビデオストリームをライブで実行する1行のコマンドはかなり長いので、実行する前にコマンドの内容を確認しましょう。
-o は出力であり、この場合は none に設定されています。
-t はビデオ クリップの長さです。ゼロを使用すると、無限に設定されます。
-w と -h はビデオの幅と高さで、この場合は 800 x 600 です。
-fps はビデオ ストリームの 1 秒あたりのフレーム数です。値が低いほどドロップアウトが最小限に抑えられます。
| cvlc は、raspivid コマンドからの出力、ビデオ ストリームを取得し、ネットワーク経由でリアルタイム ストリーミング プロトコル (rtsp) を介して h264 コーデックを使用してビデオをストリーミングするパイプです。
Raspberry Pi のターミナルでこのコマンドを実行します。
raspivid -o - -t 0 -w 800 -h 600 -fps 12 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8080/}' :demux=h264
3. Windows / Mac / Linux コンピューターにVLC をインストールし、VLC を開きます。
4. 「メディア」>>「ネットワーク ストリームを開く」に移動するか、Ctrl + N を押します。
5. Raspberry PiのRTSPアドレスとポート番号を入力します。RTSPアドレスはRaspberry Piのホスト名にrtsp://を先頭に付けたもので、ポート番号は8080に設定されています。「再生」をクリックしてストリーミングを開始します。RTSPアドレスの例を以下に示します。
rtsp://raspberrypi:8080/
VLCがストリームに追いつくまで数秒かかりますので、しばらくお待ちください。まもなく、Raspberry Piからストリーミングされたビデオが、約5~10秒の遅延を伴って表示されます。
6. ストリームを録画するには、「再生」>>「録画」をクリックし、ファイル名を指定します。停止ボタンを押すと録画が終了します。
アートに浸る:フィルターを使ったストリーミング
このプロジェクトの最終パートでは、創造性を発揮します。まず、すべての画像エフェクトの配列(リスト)を作成するスクリプトを作成します。次に、配列の長さを格納する変数を作成し、配列内の数字をランダムに選択して、ライブ配信時にどのエフェクトを使用するかを制御します。コードは、Raspberry PiのGUIテキストエディタを使って記述します。
1. Geany を起動し(メニューから)、random_stream.sh という新しいファイルを作成し、頻繁に保存することを忘れないでください。
2.コードの最初の行を入力します。この行は、Bash インタープリターが見つかる場所をコードに指示します。
#!/bin/bash
3.このプロジェクトで利用可能なすべての画像エフェクトを格納する配列を作成します。エフェクトは合計20個あり、それぞれが配列内で専用の場所に割り当てられているため、コードで乱数に基づいて特定のエフェクトを選択できます。
array[0]="none"
array[1]="negative"
array[2]="solarise"
array[3]="sketch"
array[4]="denoise"
array[5]="emboss"
array[6]="oilpant"
array[7]="hatch"
array[8]="gpen"
array[9]="pastel"
array[10]="watercolour"
array[11]="film"
array[12]="blur"
array[13]="saturation"
array[14]="colourswap"
array[15]="washedout"
array[16]="posterise"
array[17]="colourpoint"
array[18]="colourbalance"
array[19]="cartoon"
4.配列内のエフェクトの数を格納するためのsizeという変数を作成します。この変数には、配列の長さをチェックするコマンド({}経由)の出力が格納されます。
size=${#array[@]}
5.別の変数 index を作成します。この変数には、0 から配列の長さ (この場合は 20) までの乱数が格納されます。
index=$(($RANDOM % $size))
6.選択したフィルターを端末に出力し、1 秒間待ちます。
echo ${array[$index]}
sleep 1
7. raspividを使用して、解像度800 x 600、フレームレート15fpsの無限ストリームを作成します。-ifxスイッチには、配列からランダムに選択されたエフェクトが適用されます。ライブビデオのストリーミングには、今回は標準のTCPストリームを使用します。RSTPよりも少し高速ですが、ストリームにアーティファクトが発生する可能性があります。Raspberry Piは、任意のローカルIPアドレスからの接続をリッスンします(-l)。
raspivid -t 0 -w 800 -h 600 -ifx ${array[$index]} -fps 15 -l -o tcp://0.0.0.0:5000
8.コードを /home/pi/ ディレクトリに保存し、エディターを終了します。
9.ターミナルを開き、このコマンドを使用してコードを実行可能にします。
$ chmod +x random_stream.sh
10.コードを実行します。
$ ./random_stream.sh
11. Windows / Mac / Linux コンピューターでVLC を開きます。
12. 「メディア」>>「ネットワーク ストリームを開く」に移動するか、Ctrl + N を押します。
13. Raspberry PiのTCPアドレスとポート番号を入力します。TCPアドレスはRaspberry Piのホスト名で、先頭にtcp/h264://が付き、ポート番号は5000です。「再生」をクリックしてストリーミングを開始します。TCPアドレスの例を以下に示します。
tcp/h264://raspberrypi.local:5000
14. ストリームを録画するには、「再生」>>「録画」をクリックし、ファイル名を指定します。停止ボタンを押すと録画が終了します。
15. 効果を変更するには、 Raspberry Pi ターミナルでCTRL + C を押し、次に UP キーを押して Enter を押し、異なるフィルターを使用してコマンドを再度実行します。
完全なコードリスト
#!/bin/bash
array[0]="none"
array[1]="negative"
array[2]="solarise"
array[3]="sketch"
array[4]="denoise"
array[5]="emboss"
array[6]="oilpant"
array[7]="hatch"
array[8]="gpen"
array[9]="pastel"
array[10]="watercolour"
array[11]="film"
array[12]="blur"
array[13]="saturation"
array[14]="colourswap"
array[15]="washedout"
array[16]="posterise"
array[17]="colourpoint"
array[18]="colourbalance"
array[19]="cartoon"
size=${#array[@]}
index=$(($RANDOM % $size))
echo ${array[$index]}
sleep 1
raspivid -t 0 -w 800 -h 600 -ifx ${array[$index]} -fps 15 -l -o tcp://0.0.0.0:5000