Edited at

Raspberry Piで定点カメラを作っていて、画像ファイルは保存しないでWebサーバーにアップロードしたい!と思ったら意外と簡単にできたというお話


はじめに

Raspberry Piを何個も使って色々と試しているなかで、定点カメラを作った時に撮影した画像を一時的にでもSDカードやRAMディスクなどに書き込まないでサーバーに送信できないだろうかと考えたら意外と簡単にできたので、まとめてみます。


用意するもの


  • Raspberry Pi

  • USBカメラ

  • Webサーバー


環境構築

Raspberry PiへのOSインストールは複数の記事があるのでそちらにお任せするとして、OSインストール直後の作業は以下のとおり。

sudo apt update

sudo timedatectl set-timezone Asia/Tokyo
sudo apt install -y python-opencv python-requests


送信スクリプト作成

以下の手順で送信スクリプトを作成

nano fileupload.py


fileupload.py

#!/usr/bin/env python


import cv2
import time
import requests
from datetime import datetime

cap = cv2.VideoCapture(0)

cap.set(3,1280)
cap.set(4, 720)

ret, frame = cap.read()

url = "http://[your server address]/getfile.rb"

files = {'imgData': cv2.imencode('.jpg', frame)[1].tobytes()}
res = requests.post(url, files=files)
print(res.text)

cap.release()


作成したら実行権限をファイルに付与

chmod a+x fileupload.py


受信スクリプト作成

受信するサーバーにはApacheとRubyがインストールしてあって、HTTPでアクセスができるようになっているものとして、以下の送信スクリプトを作成


getfile.rb

#!/usr/bin/env ruby

require "cgi"
require 'date'

formData = CGI.new

print "Content-type: text/html\n\n"

filename = Time.now.strftime("%Y%m%d%H%M")

open("#{filename}.jpg","wb") do |fh|
fh.binmode
fh.write formData['imgData'].read
end

puts "OK"



動作確認

送信・受信のスクリプトを設置したら、Raspberry Piで以下のように実行して「OK」と表示されればアップロード成功

./fileupload.py


自動撮影

10分間隔で自動的にアップロードするよう設定します。

crontab -e

以下の一行を追加

*/10 * * * * /home/pi/fileupload.py

できた!