Raspberry Pi 4B 初期設定

# 1.はじめに
　少し前にRaspberry4Bを購入したので、設定の備忘録として残します。なお、OSイメージの書き込み等は今回は記載しない。キットのSDカードにOSが入っていることと、以前と比べインストール作業が大幅に簡略化されたためあえて書く必要もないと考えたため。
　また、(特に理由はないが)opencvは4.5.1(2021.1.3時点の最新版)とした。pip3 install opencv-pythonで入れなかったのは、画像をwindowとして表示する時によくエラーが出て対処に困ることが多いため。(原因は不明)

　購入したもの:<a href="https://www.amazon.co.jp/gp/product/B082VVBKRP/">LABISTS Raspberry Pi 4 4B(メモリ4GB)
</a>

# 2.Raspberry Pi初期設定
　初期設定方法を記載する。ライブラリアップデート、機能有効化、日本語設定、デフォルトユーザ削除について記載する。
## 2-1. ライブラリアップデート
　ライブラリをアップデートするために、下記コマンドを実行する。途中実行するかどうかを聞かれるので、y(yes)をタイプする。

```
$ sudo apt update
$ sudo apt upgrade
```

## 2-2.機能の有効化
　カメラやリモート操作用に機能を有効化する(リモート操作の設定は今回は記載しない)。まずは機能を有効化するため、下記コマンドを実行する。

```
$ sudo raspi-config
```
　下記のような画面が出てくるので、3 Interface Option　→　P1 cameraを有効化する。もしリモートデスクトップを行うならP2,P3を有効化する。(P2はいらない？)

![remmina_ICTcircle_192.168.11.11_202111-1547.684396.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671049/7e72133d-778a-54ba-b4cc-dc3f35245425.png) ![remmina_ICTcircle_192.168.11.11_202111-1541.667595.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671049/1b875cbd-d098-7ce1-2424-555f991928b8.png)

## 2-3.日本語対応
　日本語はfcitx-mozcを使用する。(メインPCの環境に合わせた)

```
$ sudo apt-get install fcitx-mozc
$ im-config -n fcitx
$ sudo shutdown -r now
```
　再起動後、Preferences(設定)からFcitx Configurationを起動する。

![remmina_ICTcircle_192.168.11.11_202111-15029.627441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671049/e4435965-9fd8-98f4-32bf-f8e23bde0fb8.png)

　Input Methodタブ内、下方に＋ボタンがあるので、これを選択し、現れたwindowの中から、mozcを選択する。
![remmina_ICTcircle_192.168.11.11_202111-15236.581880.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671049/b8a68e6b-5798-7c1c-e3bc-f4fc44ba81e5.png)

　タブをGlobal Configに切り替えて、【Trigger Input Method】を選択し、現れたwindowで【半角/全角キー】を押してトリガーキーを設定する。(この設定で日本語入力のon off設定が効くようになる)

![remmina_ICTcircle_192.168.11.11_202111-15246.981421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671049/59d57ed0-3b6f-bd7f-4aa3-a5a06e40c1d2.png)


## 2-4.既存ユーザpiの削除
　セキュリティ上の問題で初期ユーザを使用していると、そこを踏み台にして侵入されるということもあるようです。過去にNASAでデータ抜かれていたという話も(<a href="https://www.gizmodo.jp/2019/06/nasa-hacker-raspberry-pi.html">このようなものソースもある</a>)。個人で使う分には特に問題はないと思われるが、簡単にできるものは念の為に行う。
　<a href="https://www.raspberrypi.org/documentation/configuration/security.md">公式</a>に方法が記載されているのでこのまま進める。なお、作成するユーザ名はXXXとする。(適宜読み替えお願いします)

### 2-4-1. 新規ユーザの作成
```
$ sudo adduser XXX
$ sudo usermod -a -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi XXX
```

### 2-4-2. piのオートログイン処理をなくす
 今回行うlightdm.confとautologin.confを変更する処理は、公式に記載のない処理ではあるが、deluserの際にエラーが出るために行う。エラーは、プロセスのtty1が常に立ち上がるのでdeluserができないということである。<a href="https://www.raspberrypi.org/forums/viewtopic.php?t=202618">Forum</a>に同様の事象が発生した人がおり、対処方法を記載していた。(lightdm.confの処理のみではいけなかったが、もしかしたらautologin.confを変えるだけで行けるかもしれない。)

```
$sudo nano /etc/lightdm/lightdm.conf
```
![remmina_ICTcircle_192.168.11.11_202111-162447.929147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671049/22e0a975-3156-acef-36e3-d2509f989238.png)

```
$ sudo nano /etc/systemd/system/getty@tty1.service.d/autologin.conf
```

![autologin_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671049/dc9ffb64-1c3f-d364-dae9-d40b7384dfe9.jpeg)

```
$ sudo systemctl daemon-reload
$ sudo systemctl restart getty@tty1.service
```

```
$ sudo pkill -u pi
```
　この後、新ユーザXXXでログインする。

```
$ sudo deluser -remove-home pi
```

　以上の操作で初期設定を終えた。


# 3.OpenCVインストール
　せっかくRaspberry Piがあるので画像関係は抑えておきたい。そのため、メジャーなライブラリであるOpenCVを導入する。

## 3-1.準備
　<a href="https://docs.opencv.org/4.5.1/d7/d9f/tutorial_linux_install.html">OpenCV公式</a>を参考に進める。
　公式で関連ライブラリを準備する必要があるとの記載があった。そのため、下記のライブラリをインストールする。

```
$ sudo apt install build-essential
$ sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
```
　ライブラリを準備した後、ソースファイルをgithubから落とす。ホームディレクトリに落として作業することとする。

```
$ cd
$ git clone https://github.com/opencv/opencv.git
$ git clone https://github.com/opencv/opencv_contrib.git
```

## 3-2.ビルド
　先程落としたファイルを使用してビルド作業を行う。まずは、opencvディレクトリ内にbuildディレクトリを作成し、この中で作業する。

```
$ mkdir opencv/build
$ cd opencv/build
```

　makefileを作成する。 -Dより後のものは自分の必要なものを使用すること。また、企業等でライセンスを気にする場合は<b>OPENCV_ENABLE_NONFREE=OFF</b>にしたほうが良いかもしれない。

```
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
    -D ENABLE_NEON=ON \
    -D ENABLE_VFPV3=ON \
    -D BUILD_TESTS=OFF \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D CMAKE_SHARED_LINKER_FLAGS=-latomic \
    -D BUILD_EXAMPLES=OFF ..
$ make -j4
$ sudo make install
```
【make -j4】の部分で実行時間は約95minかかりました。(20:22にはじまり、21:56に終了)

　以上でOpenCVのインストール終了。


# テスト

```
$ python3
> import cv2
```
ここでエラーが出なければインストールは成功。
これでcv2.VideoCaptureとかを使って動画処理を行ったり、顔検出を行ったりが簡単にできるようになった。
せっかくなので顔検出を行った。

```(Python)
import cv2

# webカメラの映像を変数に格納
cap = cv2.VideoCapture(0)

# OpenCVに入っていた顔検出モデルのパス
path = '/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_default.xml'
# 顔検出分類器のインスタンスを作成
face_model = cv2.CascadeClassifier(path)

# ループ処理で画像を一枚ずつ画面に出力することで動画として見せる。
while 1:
    # 変数から動画情報を画像として取得。frameに画像を代入する。
    ret, frame = cap.read()
    # グレイ画像に変換して、顔検出分類器で顔を検出
    gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_model.detectMultiScale(gray_img)

    # facesに顔の検出結果が格納されている。一つの検出結果で入っている情報はx,y座標と、検出領域(四角形)の幅と高さ。
    for (x,y,w,h) in faces:
        # 検出結果の情報から、画像上に四角形を書く。　緑色(0,200,50)、線幅2pixel
        cv2.rectangle(frame, (x,y), (x+w, y+h), (0,200,50),2)

    # windowへの出力処理
    cv2.imshow('cap',frame)
    # 終了処理。 qを押すと終了する
    if cv2.waitKey(1) & 0xFF==ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
```
問題なく検出できた。なお、複数の顔を検出することも可能。


# 参考サイト
### デフォルトユーザ名変更

 - https://www.raspberrypi.org/documentation/configuration/security.md

### OpenCV

 - https://docs.opencv.org/4.5.1/d7/d9f/tutorial_linux_install.html
 - https://pimylifeup.com/raspberry-pi-opencv/
 - http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html