Sponsored Link

カテゴリー別アーカイブ: ファイル

(88) ライブカメラ画像をホームページに貼る。

(88) ライブカメラ画像をホームページに貼る。

■やりたいこと

・実家の窓際にライブカメラを設置し、窓から見える景色を東京でも眺めたい。
・映像ではなく、1分に1回程度更新される静止画でよい。
・カメラはなるべく安価なものがよい。

■必要なもの

・ホームページ設置サーバー(FTP,Python,PHPが使えること)
・WEBカメラ(Wifi接続可能であること)

■手順

手順1:WEBカメラを購入する。

・今回はI-O DATA社製の TS-WRLCE を使用する。(その後、赤外線カメラ付きのTS-WLC2でも同じ手順でできた。)

手順2:WEBカメラの設定をする。

・画像を転送するFTPサーバーの情報を設定する。

・動作検知の検出範囲を画面全体に設定する。

・動作検知の検出間隔を60秒に設定し、動作検知機能を有効に設定する。

手順3:最新画像ファイル取得プログラムを作成(Python)

このライブカメラは、指定したディレクトリ配下に「snapshot_yyyymmddhhmm」なるディレクトリを複数作成する。さらに、個々のディレクトリ配下に「motion-yyyy-mm-dd-hh-mm-ss.jpg」なるJPEG画像ファイルを複数作成する。

したがって、ホームページ上に最新の1枚を表示したい場合は、最新ディレクトリ配下の最新画像ファイルを1個だけ取得し、表示すればよい。ここではPythonでこの機能を実装する。

get_img.py

import sys
import os

#---------------------------------
# argv[1] : directory path
if __name__ == '__main__':
    ary_argv = sys.argv
    img_path = ary_argv[1] + "/"

    # 指定ディレクトリ配下の最新ディレクトリを取得
    ary_entry = os.listdir(img_path)
    ary_entry = [x for x in ary_entry if os.path.isdir(img_path + x) ]
    ary_entry = sorted(ary_entry, reverse=True)
    target_dir = img_path + ary_entry[0] + "/"

    # 最新ディレクトリ配下の最新画像ファイルを取得
    ary_jpeg = os.listdir(target_dir)
    ary_jpeg = [x for x in ary_jpeg if os.path.isfile(target_dir + x) ]
    ary_jpeg = sorted(ary_jpeg, reverse=True)
    target_jpeg = ary_jpeg[0]

    # 実行者へ答えを提供
    print(target_dir + target_jpeg)

手順4:ライブ画像を閲覧するためのホームページを作成(HTML+PHP)

livecam.php

<!DOCTYPE html>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8" />
<TITLE>サンプル</TITLE>
</HEAD>
</BODY>
<?php
  exec("python3 ./get_img.py '{FTP画像転送先ディレクトリ}'", $resp, $code);
  echo "<img src='{$resp[0]}'>";
?>
</BODY>
</HTML>

(39) シェルスクリプトファイルを作成・実行

(39) シェルスクリプトファイルを作成・実行

シェルスクリプトファイル exec.sh を作成し、実行属性を付与する。

>>> fh = open('exec.sh','w')
>>> fh.write('#!/bin/sh\n')
>>> fh.write('export LD_LIBRARY_PATH=/usr/local/lib\n')
>>> fh.write('gcc --version\n')
>>> fh.write('#end')
>>> fh.close()
>>>
>>> import subprocess as sp
>>> args = ['chmod','+x','./exec.sh']
>>> sp.call(args)
0

作成したシェルスクリプトファイルを実行する。

>>> import subprocess as sp
>>> args = ['./exec.sh']
>>> sp.call(args)
gcc (GCC) 4.9.0
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

0

(38) ファイル、ディレクトリのフルパスを取得

(38) ファイル、ディレクトリのフルパスを取得

os.path.abspath を使用し、ファイル、ディレクトリのフルパスを取得する。

>>> import os
>>>
>>> os.path.abspath('./')
'/home/user/tmp'
>>>
>>> os.path.abspath('data.txt')
'/home/user/tmp/data.txt'
>>>
>>> os.path.abspath('../data.txt')
'/home/user/data.txt'

(35) numpyでCSVファイルの読み書き

(35) numpyでCSVファイルの読み書き

6行3列のデータ配列を持つ CSVファイル を用意した。

[user@linux]$ cat test.csv
10,11,12,13,14,15
20,21,22,23,24,25
30,31,32,33,34,35

このファイルを numpy.loadtxt でリードしてみる。

>>> import numpy as np
>>> a = np.loadtxt('test.csv', delimiter=',')
>>> a
array([[ 10.,  11.,  12.,  13.,  14.,  15.],
       [ 20.,  21.,  22.,  23.,  24.,  25.],
       [ 30.,  31.,  32.,  33.,  34.,  35.]])

全要素の値を2倍した後、その配列を numpy.savetxt で CSVファイルとしてセーブしてみる。

>>> b = a * 2
>>> b
array([[ 20.,  22.,  24.,  26.,  28.,  30.],
       [ 40.,  42.,  44.,  46.,  48.,  50.],
       [ 60.,  62.,  64.,  66.,  68.,  70.]])
>>> np.savetxt('out.csv', b, delimiter=',', fmt='%d')

正しく出力できている!

[user@linux]$ cat out.csv
20,22,24,26,28,30
40,42,44,46,48,50
60,62,64,66,68,70

numpyを使わず、csvパッケージを使う方法もある。
Read

>>> import csv
>>> with open('test.csv', newline='') as fh:
...     spamreader = csv.reader(fh, delimiter=',')
...     for row in spamreader:
...         a.append(row)
...
>>> a
[['10', '11', '12', '13', '14', '15'], ['20', '21', '22', '23', '24', '25'], ['30', '31', '32', '33', '34', '35']]
>>>

Write

>>> with open('out2.csv', "w") as fh:
...     writer = csv.writer(fh, lineterminator="\n")
...     writer.writerows(a)
...
>>>
[user@linux]$ cat out2.csv
10,11,12,13,14,15
20,21,22,23,24,25
30,31,32,33,34,35
[user@linux]$

(24) テキストファイルを1行ずつ読み込み(その2)

(24) テキストファイルを1行ずつ読み込み(その2)

(20) テキストファイルを1行ずつ読み込み の別の方法です。
enumerate() を使います。

>>> fh = open('data.txt')
>>> for a,b in enumerate(fh):
...     print a
...     print b
...
0
book

1
car

2
pen

3
house

4
ball

行番号の初期値はstart=xxxxxで指定できる。

>>> fh = open('data.txt')
>>> for a,b in enumerate(fh, start=1):
...     print a
...     print b
...
1
book

2
car

3
pen

4
house

5
ball

ファイルから読み込んだ各行の改行文字はrstrip()で削除できる。

>>> fh = open('data.txt')
>>> for a,b in enumerate(fh, start=1):
...     print a
...     print b.rstrip()
...
1
book
2
car
3
pen
4
house
5
ball

(20) テキストファイルを1行ずつ読み込み

(20) テキストファイルを1行ずつ読み込み

読み込むのは以下のようなテキストファイルとする。

[user@dog-server]$ ls
data.txt
[user@dog-server]$ cat data.txt
book
car
pen
house
ball

pythonでこのテキストファイルを1行ずつ読み込む。

>>> fh = open('data.txt')
>>> line = fh.readline()
>>> while line != '':
...     print line
...     line = fh.readline()
...
book

car

pen

house

ball

改行文字まで含まれているようだ。
読み込んだ1行分のデータを split() を使って改行文字「\n」で分割し、前側のデータを表示してみる。

>>> fh = open('data.txt')
>>> line = fh.readline()
>>> while line != '':
...     line = line.split('\n')
...     print line[0]
...     line = fh.readline()
...
book
car
pen
house
ball

改行文字が消えた。

改行文字は rstrip() でも除去できる。

>>> fh = open('data.txt')
>>> line = fh.readline()
>>> while line != '':
...     print line.rstrip()
...     line = fh.readline()
...
book
car
pen
house
ball

(19) テキストファイルの読み書き

(19) テキストファイルの読み書き

まずはテキストファイルを作成する。

>>> fh = open('data.txt','w')
>>> fh.write('hello\n')
>>> fh.write('see you!\n')
>>> fh.close()
>>>
[user@dog-server]$ ls
data.txt
[user@dog-server]$
[user@dog-server]$ cat data.txt
hello
see you!

次に、作成したファイルを読み込む。

>>> fh = open('data.txt','r')
>>>
>>> data = fh.read()
>>> data
'hello\nsee you!\n'
>>>
>>> print data
hello
see you!
>>>
>>> ary = data.split('\n')
>>> ary
['hello', 'see you!', '']
>>> ary[0]
'hello'
>>> ary[1]
'see you!'