アナログメーターの画像から針の角度を読み取るやつ作ってみた(OpenCV)
会社でアナログメーターを撮影し、そこからメーターの値を自動で読み取りたい、という相談を受けました。
てことで、そういうものを早速、作ってみました。
なお、世の中にはこういうソリューション(物体検出を使用)もあるそうですが。
「アナログメーター解析AI」を創りました! | | 株式会社プライムキャスト(PRIMECAST)
ここでは敢えて、機械学習を使いません。数字はともかく、メーターの針の角度くらい、画像解析だけで行けるんじゃないか、と。
ということで、OpenCVのハフ変換というのを使います。
ここのサイトを、参考にしました。
で、ハフ変換というのは、画像中の直線や円などの図形を読み取る手法、とでも思ってください。
その会社の方の相談で読み取りたいメーターは、ガスボンベのメーターでした。
自宅には手ごろなメーターがないので、ネットのメーカーのサイトやらなんやらやらを探って、テスト画像を手に入れてきました。
このメーターの針の角度を、真下を0度として、時計回りに角度を読み取るというものを作りました。
コードは以下。
「meter_read.py」
必要なライブラリは、たった2つ。OpenCV、Numpyです。
> pip install opencv-python numpy
で、使い方は、上のメーターの画像(ここではmeter.jpg)を同じフォルダ内に置いて、Windows PowerShellなどで
> python meter_read.py
と打ち込むだけ。
先のリンクではグレースケールの画像からエッジ処理をかけてましたが、ここでは二値化した画像からエッジを読み込ませてます。
その方が、安定していたので。
で、ここから針の部分の直線の実を読み出すために、21行目の「for m in range(10,161,1):」以降の繰り返し分で最適なパラメータ値を決めています。
具体的には、2本の直線を抽出できた時のパラメータ値のみを探り出します。
で、ハフ変換を実行。
すると、こんな感じの直線が得られます。
ちなみに、この時の針の角度は、この2本の線の中間の角度から割り出してます。
この場合は約78度と返ってきました。真下が0度なので……いい感じに読み取れてます。
なお、針の角度を出すのには、ちょっと工夫が必要です。
実は針が左半分を向いているときと、右半分の方向を向いているかで、角度の式を変えないといけません。
具体的には、左下を向いているか、右上を向いているかが、このハフ変換から得られた直線の角度だけでは判定できないんです。
そこで、得られた2本の直線の交点が、右か左かどっちにあるかで、その式を分けるように工夫してます。
詳しくは、OpenCVのハフ変換のリファレンス、および上のコードをご覧ください。
なお、本当に針の向きが変わっても読み取れるのかが心配だったため、画像を回して確認してみました。
例えばこの向きでも、
こういう画像が出力されて、角度は「348度」と返ってきます。
うん、いい感じですね。
メーターごとに角度→目盛り値の変換係数を定義してやれば、物体検出など無しに使えます。
それこそ、Raspberry Piでも動かせるほど軽いので、Raspberry Pi Zero + カメラだけで運用できます。
なお、針の向きが右か左かを判定する際に、画像の中心から右か左かで判定させてますが、本当ならこのメーターの中心点から見て右か左かを見ないといけないのですが、そこはさぼってますね。
本来なら、ハフ変換で円を抽出させ、そこから中心点を探すというのを入れた方がより精度が上がります。
この辺が、参考になります。
最近ですが、何でもかんでも物体検出、画像認識を使うよりも、まずこの手の画像処理を試すことから始めた方が良いことが多いです。
事前処理をした上で画像認識などを使う方が、認識率が上がることも多いですし。
もし仕事で、自動でアナログメーターを読ませたくなったら、ぜひご参考になさって下さい。
« 新型のiPhone13/13 Pro、iPad、iPad mini、Apple Watch 7が発表 | トップページ | iOS 15へのアップグレードをためらってます・・・ »
「数値解析系」カテゴリの記事
- Windows 11でFORTRANをコンパイルしたい!という方への対処法(2025.01.04)
- どこに視線を向けているかを可視化してくれる物体検出器(2024.12.23)
- 2024年まとめ記事(2024.12.31)
- 生成AI解説書籍「ChatGPT & 生成AI」という本を買った(2024.12.08)
- Googleの生成AI「Gemini Advanced」に入ってみた(2024.12.01)
コメント
« 新型のiPhone13/13 Pro、iPad、iPad mini、Apple Watch 7が発表 | トップページ | iOS 15へのアップグレードをためらってます・・・ »
すごいですね!
書かれていることは難しそうですが、実際に目に見えて役立っているのが
面白そうだと感じました。
困っていることを解決する手段のひとつとしての技術(プログラミングや
画像処理)を学ぶのは面白いですが、目的がないまま学んでも続かない
のは当たり前だなと改めて感じました。
灘高校の武藤氏はプログラミングを実際に役立てている(ぜんそくで呼吸困難
になっている子がスマホのボタン1つで症状やヘルプできるアプリ、リモートで
受験生同士がわからない部分を教え合うアプリ)のを思い出しました。
投稿: sou | 2021年10月10日 (日) 22時27分
> souさん
ありがとうございます。最近、社内でこんなことばっかりやってます。役に立つような、立たないような……
ただ、Excelをpythonで処理するやつを社内で広めたら、意外なほど広まりました。マクロ使いほど食いついてきたんですが、実はマクロよりもpythonの方が速かったりします。役に立つと言うことは、その人の心に火を灯すだけの何か理由がある、と言うことなのですよね。灘高の先生の逸話を聞いて、そう思います。
投稿: ディープタイピング | 2021年10月11日 (月) 06時26分