技術

ワットチェッカーの数値をWebカメラとOpenCVで読み取る

GWに入ってから作ってたのがとりあえず動作するようになったので公開。
https://github.com/peta-okechan/cv7seg.py
1ファイルスクリプトにしてブログにソース載せようと思ってましたが、ちょっと長くなったのでgithubに載せました。

必要な環境

UVC対応Webカメラ
OpenCV 2.2
cv、Tkinter、PIL(Pythonモジュール)

OS X 10.6 + logicoolのWebカメラ(型番失念、UVC対応) + Python 2.7 + OpenCV 2.2 の組合せでしか動作確認してませんが、特にOS・デバイス依存な書き方とかはしてないハズなので環境さえ整えれば他のOS・ハードウェアでもそのまま、もしくは少しの修正で動くんじゃないかなぁと思ってます。

使い方

1. ワットチェッカーとWebカメラの位置関係を固定します。


僕はこんな感じで針金で適当に固定しました。太さ2.5mmの針金を使ってます。
真正面から撮るようにするとカメラ自身が映り込みますので少しずらすのがコツです。

2. ワットチェッカーをコンセントに挿して、消費電力を測りたいものの電源をワットチェッカーのコンセントに挿します。

この時、ワットチェッカーの液晶面が影にならないようにかつ照明がカメラに対して映り込まないようにするのが読み取り精度を上げるコツです。

3. WebカメラをPCに繋いだら、cv7seg.py を起動します。


初回起動の場合、上のようなウインドウが出るハズです。この画面には一応「正規化モード」という名前が付いてます。

4. 正規化モードで液晶パネルの位置をプログラムに教えてあげます。


パネルの四隅をクリックすると(クリックした座標に赤い点が出ます)、次のようになります。

ここで、液晶パネルの表示以外のものが映ってない状態で、数字に歪みがなければ確定ボタンを押します。
液晶の枠も読み取り処理にとってはノイズとなりますので、少し狭めの領域を指定するのがコツです。

5. 学習モードで数字の形をプログラムに教えてあげます。

「モード」から「学習」を選ぶと次のような画面になります。

ここで数字の部分をドラッグすると次のように枠が表示されますので、いい感じのところでその数字に対応する下のボタンをクリックしてください。
数値ぴったりではなく周りの余白も少し含むように囲むのが精度を上げるコツです。多分。
特に「1」は狭めに囲んでしまいがちですが、他の数字と同じくらいの幅で囲まないと精度が落ちるかもしれません。

色々、ワットチェッカーのモードを切替えたりしながら、0〜9まで全部の数字を指定してください。

こんな感じになれば学習は完了です。

6. 数値を読み取ります。

「モード」から「ロギング」を選ぶと次のようになります。

「スタート」ボタンを押すと、液晶の数値を読み取りながらログを取ります。

右側に棒グラフをリアルタイムで表示してくれますが、超適当に作ったので雰囲気だけを楽しむのがコツです。

「生データをコピー」ボタンで、読み取った数値の改行区切りのものがクリップボードにコピーされます。
Excelとかで煮るなり焼くなりご自由にどうぞ。

「Google Chart URLをコピー」ボタンで、Google ChartのURLがクリップボードにコピーされます。
こんな感じの棒グラフになります。
Google Chart

読み取りの更新間隔は1秒となってます。
たまに、ワットチェッカーの数値の表示の更新タイミングと読み取りのタイミングが重なり続けて精度が出ない場合がありますので、そういうときはプログラムを立ち上げ直してタイミングをずらしてあげてください。

正規化と学習のデータはプログラム終了時にプログラムと同じディレクトリにcv7seg.pickleという名前で保存され、次回起動時に自動的に読み込まれますので、ワットチェッカーやカメラを動かさなければ、次からはすぐにロギングを開始することができます。

7セグメントの数値を読み取る事に特化はしてますが、ワットチェッカー専用ではないので、他のものにも流用できるでしょう。

とりあえず動作させる事を優先に適当に作ったので、色々と不備不具合があると思います。(小数点非対応、マイナス非対応などなどなど)
githubは今回はじめてなのでよく分かりませんが、パッチなんかを提供していただけるとすごく嬉しいです。

ライセンスはGPL v2 or laterにしておきます。
GPLについてはよく知りませんので、要件を満たしてないとかが後で判明したらその時は別のライセンスにするか要件を満たすようにするつもりです。

コメント

サイト拝見させていただきました。
数字の読み取りを使わさせていただいております。

今回公開されているソースですが、OpenSUSE 13.1 上で走らせると
カメラの初期化でエラーを吐き出します。

おそらく、2回以上カメラを初期化している記述があるためと思われます。
一時的にカメラの初期化を正規化、学習、ロギングで作業をこなす度
コメントアウトすることで回避しました。

試していただきありがとうございます。
また、不具合についてもご報告ありがとうございます。
時間があるときに確認してみます。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください