IOT:ラズベリーパイにVNC接続してOpenCVで顔認識する

どーもこんにちは(´・ω・`)です。

 

前回、ラズベリーパイにVNC接続してOpenCVでカメラの起動に成功しました。

今回は更に、そのOpenCVで顔認識も追加していこうと思います。

bcm2835-v4l2 の自動化

前回ハマりました、bcm2835-v4l2 についてですが、やはりシャットダウンすると、無効になってしまい、OpenCVが機能しませんでした。

今回は、まず起動したときに自動的にbcm2835-v4l2 が実行される方法からやっていきます。

/etc/modules を開くと

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.

i2c-dev

と書いてありますが、これは”ブートするときにロードするためのカーネルモジュール群” を書いておく場所になっています。Windowsでいうとスタートアップです。

ここにbcm2835-v4l2をいれればOKなのですが、このファイルは書き込み禁止なので、予め解除しておきます。

ファイル書き込み禁止を解除する

パーミッションを確認します。

pi@pi:/etc $ ls -l modules

-rw-r–r– 1 root root 203 3月 23 20:29 modules

スーパーユーザーsudoとしてチェンジモードchmodして、パーミッションを777にします。

pi@pi:/etc $ sudo chmod 777 modules

で、変更が成功したか確認すると
pi@pi:/etc $ ls -l modules

-rwxrwxrwx 1 root root 203 3月 23 20:29 modules

フルアクセスに変更されました。

その上で、チェンジディレクトリcd /etc/でvimでmodulesを開きます。

pi@pi:/etc $ vim modules

i2c-devの下にbcm2835-v4l2を追加して保存しましょう。

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.

i2c-dev
bcm2835-v4l2

キャットで確認すれば

pi@pi:/etc $ cat modules

しっかりとbcm2835-v4l2が追加されているのがわかると思います。

本題:Opencvで顔認識をやってみる

基本的には、前回のコードに学習済みハールカスケードと顔認識した顔に四角い図形でマーキングをするスクリプトを追加するだけです。

まずhaarcascade_frontalface_alt2.xmlは/usr/local/share/OpenCV/haarcascades/ の中に入っているので、作業ディレクトリであるhome/pi/の中へコピーを作っておきます。

以上、簡単ですね。

IOT:ラズベリーパイにVNC接続してOpenCVで cv2.VideoCapture(0)してみる

どーもこんにちはKeita_Nakamori(´・ω・`)です。

今日は、WindowsマシンからラズベリーパイにVNC接続してOpenCVで cv2.VideoCapture(0)に挑戦します。

まずはrealVNC viewerを起動してIPアドレスを打ってVNC接続します。

1回つなげたことのあるIPアドレスは保存され、アイコンみたいに表示されるので2回目からはアイコンをクリックするだけの簡単操作でした。

落とし穴

早速ハマりました。cap=cv2.VideoCapture(0)してもcapにはなにもデータが入ってきません。ふぁ~(*´Д`)

ret, img = cap.read() しても、当然imgはNoneです。

なぜだ!

思い出しました

そう、かつてハマりまくった、あのときを・・・

ラズパイ専用カメラをしようしているので、一般的なwebカメラとして認識できるように下記のコードを実行することが必要でした。

注意点としては 最後の部分は 「ぶい よん える に」 です。

「ぶい よん いち に」 だと思って奮闘してしまいました。

sudo modprobe bcm2835-v4l2

ということで、shellでsudo modprobe bcm2835-v4l2と打ってカメラを認識させます。

テストコードを実行すると・・・

はい、隣の部屋のソファーが写っています。

弱点

ラズパイはwifi接続、Windowsマシンは有線ですが、VNC解像度をミディアムにしても、カメラのキャプチャー映像はガックガク!!です。

低解像度だと色がキッタナイ!

どうにもなりません。

念の為、試運転のコードを貼っておきます。

 

 

IOT:ラズベリーパイにwindowsからVNC接続

今日はSSH接続に引き続きVNC接続をやってみます。

IT予備知識

VNC

-Virtual Network Computing

仮想ネットワークコンピューティング。

サーバ側(ラズパイ)の画面をにピクセル化してクライアント(windowsマシン)へ送信しクライアント側の画面から遠隔操作することができます。

通信プロトコルはRFBプロトコルという、正にVNCのための非常に軽いプロトコルを使います。(RFB = Remote Frame Buffer)

VNCソフトウェアのインストール

RealVNCのVNC Viewerをダウンロードします。

 

起動したら、SSH接続に成功したラズパイのIPアドレスを入力します。

SSH接続と同様にIDはpi、そしてパスワードを入力します。

これだけで、ラズパイのGUIをリモートコントロールできます。

ラズパイの画面解像度の設定

しかし、ラズパイ画面の解像度が悪いので、設定します。

ラズベリーマークのアプリケーション>設定>Rasberry Piの設定>1920x1080

windows側の画面設定1920×1080に合わせました。とりあえずこの設定でやってみましょう

システムタブ>解像度>

右下のOKを押すと再起動が促されますの再起動します。

すると、一旦VNC接続が切れますが、1分位待つと再起動完了の頃合いで再び自動で接続されます。

画面上にマウスカーソルを持っていくと、なにやらVNCの画面設定がポップダウンします。歯車マークを押すとプロパティ設定が開くのでさ、General>Picture quality:をautomaticからHighに変更しました。

ScalingもAutomatic(Prewserve aspect ratio=ON)にしましたが、人によっては、若干見切れているとか調整の余地がありそうです。

IOT:ラズベリーパイ IPアドレスの固定方法

前回のラズパイSSH接続に引き続き、IPアドレスの固定をやってみます。

まずはwindows端末からTeraTermでラズパイにSSH接続してShellに入りましょう。

ここで、IPアドレスの固定に関する設定ファイル 「/etc/dhcpcd.conf」 を開いてみます。vimエディタで下記のように開きます。

vim /etc/dhcpcd.conf

これの最後に

を付け加えます。iで挿入モードにして :wq 書いて終わって・・・

sudo rebootします。

ラズパイが再起動しますが、その様子を伺うことはできません。1分くらい待ってrebootが完了した頃合を見計らって、TeraTermで変更前のIPアドレスを打ってみますと・・・

繋がりませんよね。なので今回設定したstatic ip_address=192.168.10.111/24 にしたがってIPアドレスを192.168.10.111に変更したところ、

つながりました。shellが立ち上がります。

ここでifconfigをしてみてください。

しっかりと

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.111 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::570e:b515:f27c:cf1a prefixlen 64 scopeid 0x20<link>
inet6 240f:7e:ab52:1:ee7e:c132:a6b2:b0d9 prefixlen 64 scopeid 0x0<global>

というように、。192.168.10.108  から 192.168.10.111へIPアドレスが変更されています。

以上です。

 

IOT:ラズベリーパイで日本語入力

日本語入力ができるようになるまで

ラズパイは初期状態で日本語入力ができません。

ブラウザも全部アルファベットになってしまいます。

日本語フォントをインストール

ipafontとipaexfontがよさそうです。

sudo apt-get install fonts-ipafont fonts-ipaexfont

日本語IME:Mozcをインストール

まずはアップデート
sudo apt-get update

Google日本語入力のMozcをインストール

読み方は、もずく・・・でいいんでしょうか?

sudo apt-get install fcitx-mozc
インストール後はラズパイを再起動しておきましょう。

日本語切り替えの設定

メニュー>設定>Fcitx設定

入力メソッドの設定>全体の設定

ホットキー>入力メソッドのオンオフ>半角/全角を押すと hankakuzenkakuと入力されるので これでOKします。

IOT:ラズベリーパイ SSHによるリモート接続

SSHによるリモート接続

ラズパイを買ったときに一度試してみたのですが、スキルが低すぎて全くできませんでした。

今回は、3ヶ月間色々学んできたので、ある程度直観力が付いたと思いリベンジ致します。

TeraTermをwindows側にインストールします。

管理者権限でログインしておきましょう。でないとエラー5にはじかれて無理でした。

最新のTera Term 4.102を入れました。

ifconfigでIPアドレスを調べる

ラズベリーパイのMACアドレスと、サブネットマスクを調べます。

有線の場合はeth0、無線の場合はwlan0を見ます。今回は無線でやります。

mtu 1500
inet 192.168.xxx.xxx (xxxはお使いのラズパイ、通信環境によって違うでしょう。)
netmast 255.255.255.0
と書いてあります。

TeraTermからラズパイにSSH接続

  1. windows側でTeraTermを起動させてください。
  2. TCP\IP ホスト 192.168.xxx.xxx と入力します。
  3. ヒストリにチェック(意味は不明)
  4. TCPポートは22固定です。いじるとつながりません。
  5. サービス SSH バージョンはSSH2
  6. OKします
  7. 次の画面でユーザー名にpiと入力します。これはラズパイのユーザー名ではありません。
  8. パスフレーズはラズパイで設定したパスワードになります。
  9. パスワードをメモリ上に記録するをチェック
  10. プレインパスワードを使うをチェック
  11. OKします。→接続できたでしょうか。

課題

現状まだIPアドレスを固定していないため、起動するたびにどんなIPアドレスになるのか予想が付きません。次はIPアドレスの固定をやってみましょう。

また、つながったのはいいのですが、Linuxのshellだけでは厳しいものがあります。

VNCで接続するとLinuxのGUIが丸ごと操作できるようになるので、次回の次回あたりでやってみましょう。

IOT:Python socketモジュールで通信してみる

どーも こんちには Keita_Nakamori (´・ω・`) です

今日は、socketモジュールを使ってみます。

前回、少しsocketモジュールについて基本的な操作をやりましたが、実際に運用するとなると不備が多いので、そこを修正していきます。

IT用語 (予備知識)

ポート

ネットワーク内の端末間でデータをやり取りする港(port)です。

ポート番号

ポートの番号です。TPCでデータをやり取りするとき、データは1プロセスとか1スレッドというプログラムの塊を対象とします。そのプロセスにはポート番号が割り当てられそこを通ってデータをやり取りします。

IPアドレスが住所なら、ポート番号はマンションの部屋番号みたいなものです。

よく使う番号をピックアップしてみます。

  • TCP 20 : FTP (データ)
  • TCP 22 : SSH
  • TCP 25 : SMTP
  • TCP 80 : HTTP
  • TCP 443 : HTTPS

ポート番号の種類

ポート番号は0から65535まで存在します。その中でも3つの種類に分けれれます。

ウェルノウンポート番号 0~1023

よく知られているポート番号という名前の通り、TPC/IP通信において主要なサービスがすでに使用しているポート番号です。ユーザーがここをいじってしまうと不具合が生じるので触らないでおきましょう。

レジスタードポート番号 1024~49151

特定のアプリケーションなどが使用することになっている番号です。IANAという団体が管理しているので、使うときは申請しなくてはいけません。

その他のポート番号 49152~65535

ユーザが自由に使って良いポート番号です。しかし、やたらと開放してはいけません。必要なものだけ開けましょう。

スクリプト

続きはあとで書きます。

IOT:python LINE Notify に メッセージを送る

どーも こんちには Keita_Nakamori (´・ω・`) です

PythonからLINE Notifyにメッセージを送るということをやってみようと思います。後々IOTの一環で、設備などの状態を監視し、故障予測の通知をしていくためにやってみました。

 

LINE notifyのAPI ドキュメント

LINE notifyのAPI ドキュメントをみるとやり方が書いてありますので、その通り進めました。通常のLINEアカウントがあればOKです。

予めトークンを取得しておいてください。

スクリプト

下記コードの<ここにアクセストークンを入れる>へ代入してください。< >は要りません。Bearerとの間にはスペースを一つ入れてください。

messageをmassageとミスタイプして焦らないでください。(わたしです)

実行すると下記のように自分のラインへアラートが来ます。

実行結果

IOT:python requestsモジュールを使ってみる

こんにちは Keita_Nakamori(´・ω・`)です。

今日は python urllib.requetsモジュールに続きまして requestsモジュールを使ってみようと思います。名称がとても似ていますが別物です。

前回のurllib.requestがpython標準モジュールであるのに対して、
今回のrequestsモジュールは標準ではなく、より使いやすく改良されています。
エンコードなども自動でやってくれるので、こちらのほうが圧倒的に人気があります。

JSONをディクショナリで取り出すときは requests.json() があるので jsonモジュールも不要です。

IT用語 予備知識

HTTPステータスコード

HTTPにおいてWebサーバからのレスポンスの意味を表現する3桁の数字からなるコードです。例えば、200はリクエストに対して正常にレスポンスが得られたという意味になります。

requestsモジュール

GET

POST

PUT

DELETE

 

 

IOT:python urllib.request を使ってみる

こんちには Keita_Nakamoriです。

Python標準モジュールのurllibを使ってHTTPメソドを実行してみましょう。

IT用語 (予備知識として)

HTTPメソド

クライアントからサーバーに命令をする具体的なやり方のことです。

基本の4つの操作
GET:データを参照する
POST:データを新規登録する(パスワードを見えないように送るとき)
PUT:データを更新する
DELETE:データを削除する

その他 HEAD OPTIONS TRACE PATCH LINK UNLINK と色々あります。

REST

-REpresentational State Transfer

”表現文の転送”ということでしょうか。Webサービスに対してデータをやり取りする際の取り決め、というかコンセプトです。

RESTに従ったWebサービスは、HTTPメソドの形式でアクセスすることでデータの送受信を行えます。

REST APIという形でまとまっているWebサービスが多いので利用できます。

パケット通信

音声通話のように回線を占有するのではなく、
データを小さな単位に分割して送受信することで
複数のユーザーで同じ回線をシェアできる方法です。

送信されたデータは交換機の記憶メディアに一時的に蓄積されるので
相手の通信環境が悪くても、復帰したときにデータを受信できます。

ペイロード

パケット通信においてパケットに含まれるヘッダやトレーラなどの付加的情報を除いたデータ本体のことです。

パケットにはデータの転送先や転送経路などを制御するための情報を含むヘッダや、データの破損などを検査するトレーラなどの情報が、データそのもののほかに付加されて送られて来ます。

ペイロードは、こうした情報を対象に含めず、ユーザーが送信したいデータそのものを指し示す際に用いられます。

urllibモジュール

基本的な GET

パラメータを含んだGET

パラメータが見えないようにするPOST

PUT

DELETE

ここで、HTTPError: HTTP Error 405: METHOD NOT ALLOWED とエラーになりました。DELETEは用意されていないようです。