ラズパイカメラ・モジュール(レガシーカメラ)
【注意】※最新のラズパイOSでは基盤に実装するカメラが非対応と悲しい。「Raspberry Pi OS (Legacy)」をインストールして使います。

本日のメニュー
- 開発者のためのプラットフォーム GitHub
- レガシーカメラ picamera
- オブジェクト Object
- カメラ動画撮影 VideoCapture
- 画像認識AI, OpenCV
- ラズタンク・リモート運転
開発者のためのプラットフォーム [GitHub]
GitHubは、複数のプログラマーが共同でコードを開発する場所。置き場所をリポジトリという。

GitHubから最新のコードをダウンロードしてみよう
$ git clone https://github.com/CoderDojoOme/razpi.git
すると新しくrazpiディレクトリが作成される。
$ cd razpi
ファイルを確認する。ファイルが有れば成功。
$ ls
ラズパイカメラを装着
ケーブルの青色を目印する。

ラズパイカメラの検査
カメラデバイスが認識されるかテスト
$ vcgencmd get_camera
supported=1 detected=0, libcamera interfaces=0
↑ ここを見る
supported=1 detected=0 #認識されてない
supported=1 detected=1 #認識された
カメラで撮影できるかテスト
$ raspistill -o test.jpg

レガシーカメラ picamera
ラズパイ専用カメラで撮影した画像を保存するコード。手入力でコードを書いてみてください

実行してみる。
$ python cap.py
オブジェクト Object
オブジェクト指向プログラミングでは、関連するデータを束ね、代入、演算、関数、メソッドを介した受け渡し、といった操作の対象にでき、またメッセージの受け手になれる実体をオブジェクトと呼ぶ。

レガシーカメラ picamera
使えるコード[camera.py]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import picamera
import time
def capture( intW, intH ):
global picamera
picamera = picamera.PiCamera()
picamera.resolution = (intW, intH)
picamera.rotation = 180
picamera.start_preview()
picamera.led = True
#time.sleep(2)
picamera.capture( "/home/pi/python/picture.jpg" )
if __name__ == '__main__':
if (len(sys.argv) <=2):
intWidth = 800
intHeight = 600
else:
intWidth = int(sys.argv[1])
intHeight = int(sys.argv[2])
capture( intWidth, intHeight )
解像度 800 x 600 ピクセルで撮影、画像をファイル名「picture.jpg」で保存
$ python camera.py 800 600
$ python camera.py 1024 800
カメラ動画撮影 VideoCapture
まず実行してみよう
$ python video.py
小さいカメラ画像を取得しています。PC画面でこれを拡大する改造をしてみましょう

画像認識AI, OpenCV
OpenCVは画像処理・画像解析および機械学習用pythonライブラリ
まず実行してみよう
$ python capture.py
顔を検出して、緑色の四角形で顔を囲う描画をしています

検出する物体はHaar-like特徴分類器ファイルで変更することができます。
haarcascade_eye.xml 目
haarcascade_eye_tree_eyeglasses.xml メガネ
haarcascade_frontalcatface.xml 猫の顔 (正面)
haarcascade_frontalcatface_extended.xml 猫の顔 (正面)
haarcascade_frontalface_alt.xml 顔 (正面)
haarcascade_frontalface_alt2.xml 顔 (正面)
haarcascade_frontalface_alt_tree.xml 顔 (正面)
haarcascade_frontalface_default.xml 顔 (正面)
haarcascade_fullbody.xml 全身
haarcascade_lefteye_2splits.xml 左目
haarcascade_lowerbody.xml 下半身
haarcascade_profileface.xml 顔 (正面)
haarcascade_righteye_2splits.xml 右目
haarcascade_smile.xml 顔 (笑顔)
haarcascade_upperbody.xml 上半身

180度回転したい場合。
# USBカメラで画像を取得する。
capture = cv2.VideoCapture(0)
rtn, frame = capture.read()
img_rotate = cv2.rotate( frame, cv2.ROTATE_180 )
if( rtn == True ):
cv2.imwrite( "capture.jpg", img_rotate )

グラフィックを変更できる
線分を描画: cv2.line()
矢印を描画: cv2.arrowedLine()
長方形を描画: cv2.rectangle()
円を描画: cv2.circle()
楕円を描画: cv2.ellipse()
円弧を描画: cv2.ellipse()
マーカーを描画: cv2.drawMarker()
折れ線、多角形を描画: cv2.polylines(), cv2.fillPoly(), fillConvexPoly()
文字列(テキスト)を描画: cv2.putText()
画像を反転:cv2.flip()
#cv2.flip(第一引数は画像データ, 第二引数が方向[0:上下反転, 1:左右反転, -1:左右反転&上下反転])
#使い方の例(上下反転): imgFlip = cv2.flip(frame,0)
▼マニュアル
https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html

色彩検出もできる
赤色だけを検出したサンプル。色彩検出のコードは、ラズタンクの自動走行[video-track.py]で使っています。
タイムアウト用モジュールをインストールするには[$ pip install timeout-decorator]です。

次回はラズタンクをリモート運転
- 1.ラズタンクにリモート接続[$ mstsc /v:razpi**.py]
- 2.ターミナル1起動し、カメラ動画撮影ON[$ python video.py]
- 3.ターミナル2起動し、ラズタンク運転[$ python tank.py]
- 4.ターミナル3起動し、サーボモーター起動[$ python servo.py]
左右反転のコードを教えてください。
下記、反転のコードを本文に追記しました。左右なので第二引数は1です。
画像を反転:cv2.flip()
#cv2.flip(第一引数は画像データ, 第二引数が方向[0:上下反転, 1:左右反転, -1:左右反転&上下反転])
#使い方の例(上下反転): imgFlip = cv2.flip(frame,0)
教えてくれて、ありがとうございます。ラズタンクの改造頑張ります。