⏲️

7セグの読み取り装置を簡単に作ってみた

2021/06/15に公開

割と最近、 7セグの表示を読み取ってデータベースに保存する という仕組みを作ったんですが、活用シーンが割とありそうなのでザックリですが作り方をまとめます。

7セグ読み取り

コレが一番肝心なところですね。
SSOCR ( Seven Segment Optical Character Recognition ) を使うとかなりいい精度で読みとってくれます。
7セグに特化してる分は高精度なのでしょう。
僕が処理した範囲ではTesseractOCRより読取精度が良かったです。

SSOCRのインストール

サイトからソースをダウンロードして

  • make
  • make install
    だけで大丈夫と思います。

Windowsの場合、先に Cygwin をインストールが必要です。
インストール時に

  • gcc-core
  • gcc-g++
  • libintl-devel
  • imlib2
  • imlib2-devel
  • cygutils-X11

あたりを追加したかな?(あとでも追加可)
最初にやったWindows PCでは他にも何かアレコレ入れたせいか問題なくmakeできましたが、2台目のWindows PCではエラーが出てmakeがコケました。
いろいろやってみたけど解決しないので、コマンドを直打ちして力業でmake。
(オススメはしません。自己責任で。。。)

> cc -D_FORTIFY_SOURCE=2 -Wall -W -Wextra -pedantic -Werror -pedantic-errors -fstack-protector-all  -O3   -c -o ssocr.o ssocr.c
> cc -D_FORTIFY_SOURCE=2 -Wall -W -Wextra -pedantic -Werror -pedantic-errors -fstack-protector-all  -O3   -c -o imgproc.o imgproc.c
> cc -D_FORTIFY_SOURCE=2 -Wall -W -Wextra -pedantic -Werror -pedantic-errors -fstack-protector-all  -O3   -c -o charset.o charset.c
> cc -D_FORTIFY_SOURCE=2 -Wall -W -Wextra -pedantic -Werror -pedantic-errors -fstack-protector-all  -O3   -c -o help.o help.c

その後に make install でちゃんと使えるようになりました。

読取

動作確認

確認で公式サイトのトップにある6桁の7セグ画像を落として

> ssocr.exe -D-1 -t 70 six_digits.png

と実行すると 431432 が返ってきました。
(指定しているパラメータについては、公式サイトを参照ください)

環境に合わせた調整

使う環境やカメラによって取得できる画像は様々です。
そのため、環境に合わせた画像の前処理やパラメータの調整が必要です。
ザックリと

  • 明るさ、コントラストの調整
  • 7セグ部分の切り出し
  • 回転角度の調整

あたりが必要です。

明るさ、コントラスト等

imagemagickあたりでコマンドからパラメータで調整するといいと思います。

切り出し

余計なものが写っていると7セグの読取精度が下がります。
できるだけ7セグの部分だけを処理するのがよいです。
切り出し(読取エリアの設定)は、SSOCRのパラメータで可能です。

crop X Y W H
    Use only the subpicture with upper left corner (X,Y), width W and height H.

詳細はサイトのマニュアルを参照してください。
サンプル画像だと

> ssocr.exe crop 3 3 40 65 -d1 -t 70 six_digits.png

4 と返ってきます。

回転角度の調整

SSOCR、全体的に7セグの読取精度はよいのですが、角度が悪いと特に "1" の読取精度がダダ下がりでした。
角度はカメラを設置するときに調整して固定するのがよいですが、必要な場合はこれもパラメータで調整可能です。

rotate THETA
    Rotate the image THETA degrees clockwise around the center of the image. 
    Image dimensions do not change, pixels rotated out of the image area are dropped, 
    pixels from outside the image rotated into the new image are set to the background color. 

その他

他にも、数字の桁数、小数点の有無、"-"符号の有無などパラメータで調整できます。
必要に応じて設定してください。

読取装置の作成

これを使って、以下の2例を作成しました。
構成や処理フローなど参考までに。

Windows10 + ネットワークカメラ

構成は

  • Windows10 PC
  • ネットワークカメラ
  • NAS
  • DB

です。
流れは、

  • ネットワークカメラで7セグを撮影
    • 定期的に自動撮影
    • カメラの機能で可能ならそれを利用、もしくはコマンド等でも
    • USB接続のWebカメラでも、PCの内蔵カメラでも、7セグの写真が撮れたらOK
  • 7セグの写真をNASに保存
  • Windows10 PC上でNASに保存された写真を読取処理
    • SSOCRを実行するバッチを作成
    • タスクスケジューラでバッチを定期実行
  • 読み取った値をDBに保存
    • DBでもよいですし、エクセルやテキストに保存でもよいと思います。

という感じです。

RaspberryPi Zero + PiCamera

構成は、

  • RaspberryPi Zero
  • PiCamera
  • DB

です。

流れは、

  • RaspberryPi ZeroからPiCameraで写真撮影
    • コマンドで撮影可
      > raspistill -w 1920 -h 1080 -o pi-camera.png
  • SSOCRで読取処理
  • DBなどに保存

という感じで、上記を行う一連のシェルを作成して、cronで定期実行します。

まとめ

読取装置の構成や処理の詳細は環境によって異なると思いますが、 写真撮影SSOCRの処理 で何とかなるということはわかってもらえたかと思います。

皆さんのお役に立てば幸いです。

Discussion