概要
ssh 接続で Raspberry Pi に接続した上で、画像でのデバックが必要な openCV の開発をするためのシェルスクリプトを書いた。
環境
- ubuntu 18.04 LTS
- Raspberry Pi 2
プログラムの大まかな流れ
1.同一ネットワーク内の Raspberry Pi を検索。
2.プログラムファイルを scp でローカルからリモートにコピー。
3. ssh 接続をし,Raspberry Pi でプログラムを実行。
4.出力された画像ファイルを scp でリモートからローカルにコピー。
5.コピーした画像ファイルを表示。
プログラム
ssh_opencv_developer.sh
# !/usr/bin/bash
# エラーが発生したときは実行を中断
# 存在しない変数はエラー
set -eu
macadress='00:00:00:00:00:00'#Raspberry Pi 3 以降の場合は、'Raspberry'でも可
password='password'
filename='main.py'
local_path='/home/hoge/'${filename}
remote_path='/home/pi/'${filename}
# 同一ネットワーク内の Raspberry Pi を取得
echo '同一ネットワーク内の Raspberry Pi を検索しています。'
list=$(arp-scan --localnet --interface wlan0 | grep ${macadress} )
ip=$(echo ${list} | cut --delimiter " " --fields 1)
# ファイルのコピー
# ディレクトリごとコピーする場合は-rオプションを使う
echo 'ローカルからリモートにファイルを転送します。'
sshpass -p ${password} scp ${local_path} pi@${ip}:${remote_path}
# Raspberry Pi にログインしコマンドを実行したのちログアウト
echo 'ssh 接続でリモートに接続しコマンドを実行します。'
sshpass -p ${password} ssh -t pi@${ip} 'sudo python /home/pi/main.py && exit'
filename='photo.jpg'
local_path='/home/hoge/'${filename}
remote_path='/home/pi/'${filename}
# ファイルのコピー
# ディレクトリごとコピーする場合は-rオプションを使う
echo 'リモートからローカルにファイルを転送します。'
sshpass -p ${password} scp pi@${ip}:${remote_path} ${local_path}
display ${local_path}
使用方法
サンプルとして以下のプログラムを例にして説明する。
以下のプログラムはウェブカメラで取得した画像をホームディレクトリに保存するというプログラムである。
main.py
# -*- coding: utf-8 -*-
import cv2
cap = cv2.VideoCapture(0)
ret, img = cap.read()
# 平滑化により外乱除去
img = cv2.medianBlur(img, 5)
# グレースケールへ変換
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 絶対パスで指定して下さい。プログラムが正常に動作しない場合があります。
path = "/home/pi/photo.jpg"
cv2.imwrite(path, img)
以下のようにシェルスクリプトを実行することで、リモートでプログラムが実行され、出力された画像がローカルで表示される。
terminal_on_local_computer
sudo sh ssh_opencv_developer.sh
結果
ssh 接続で openCV の開発が出来るようになった。
追記(2019/11/21)
異なるホスト間のファイル同期ではrsync
コマンドを使いましょう。