みなさん、こんにちは!
今回は、環境センサーの画面を定期的に撮影し、表示されている数値(例えば二酸化炭素濃度)をOCRで読み取るという、よくある作業での画期的な工夫をご紹介します。
実は以前まで、この機能はカメラの位置ずれが大きな課題になっていました。しかし、「特徴点マッチング(ORB)」という方法を使うことで、この問題が一発で解決したのです!
やりたかったこと – 環境センサーの数値の自動記録
介護施設内の居室や共用部には、空気質を監視するために環境センサー(CO₂濃度モニター)が設置されています。毎回人手をかけてノートに数値を書込んでいたのですが、センサーの画面を定期的に撮影し、表示されている数値(ppm)をOCRで自動認識して記録することで自動化したいという依頼を受けました。
数値の読取なので対象文字の種類が少なく、難易度はそれほど高くないように思えました。そこで、気軽に受けてしまったわけです。
当初はTesseract OCRを使用し、読み取りたい数値部分の座標(画面の左上・右下)を手動で指定して抽出するというシステムを構築しました。
カメラの位置ずれという大きな壁
しかし、このシステムには大きな問題がありました。それは、撮影のたびに微妙に画面が斜めになったり、環境センサーの設置位置がずらされて画面の大きさが変わったりすると、OCR対象の文字を見失ってしまうことです。
いくつかの対策も試しました。
- モニタの四隅に位置合わせ用のQRコードを貼る → 切り出す四隅のずれが大きく、さらに夜間はQRコード自体が読み取れないため断念。
- 液晶画面が発光していることを利用してディスプレイの角を検出 → 色や光の条件によって失敗が頻発。
結果として、「数値がうまくOCRできない」という状況が続き、安定した運用が不可能でした。とにかく「毎回同じ場所を切り出す」ことができない限り、一歩も前に進めない状況となってしまったのです。
ORB特徴点マッチング+射影変換で画像補正できる!
数ヶ月間悩み、もうOCR自体を諦めようかと思っていた矢先、たまたま調べたOpenCVの資料から、「特徴点マッチング」機能(ORB)の存在を知りました。
この方法では、以下のような手順で画像のズレを補正できます。
- 1枚の基準画像(良好な状態のセンサー画面)を用意します。
- 毎回撮影された画像と基準画像を比較し、画面中の「特徴点」を自動で検出します。
- それらを対応付けて「画像のズレ」を計算します。
- 画像全体を「補正」して、基準画像と完全に重なる形に変換します。
これにより、どんなに斜めでも、少しずれても、変形しても、読み取りたい部分(CO₂数値など)を常に同じ座標から抜き出せるというのです。まさに、求めていた解決策そのものでした!
コードも比較的単純で、大きな変更なく実装できそうだったので、既存システムに組み込み、早速試してみることにしました。
Pythonでのざっくりとした実装例
今回はPythonとOpenCVを使いました。以下の通り、実装は非常にシンプルです。
import cv2
import pytesseract
# ORB特徴点で基準画像と現在画像を比較 → 射影変換で補正
# ※ src_ptsとdst_ptsは、ORBマッチング結果から得られる対応点です
M, _ = cv2.findHomography(dst_pts, src_pts, cv2.RANSAC, 5.0) # findHomographyはRANSACを使うのが一般的です
aligned = cv2.warpPerspective(input_image, M, (w, h))
# 基準画像ベースの座標でROIを抽出
# ※ y1, y2, x1, x2は基準画像上で特定したROIの座標です
roi = aligned[y1:y2, x1:x2]
# OCRで数値読み取り
# 数値のみを読み取る設定(通常の数字フォントを想定)
text = pytesseract.image_to_string(roi, config='--psm 7 -c tessedit_char_whitelist=0123456789.')
たったこれだけで、毎回同じ位置からCO₂濃度を安定してOCRできるようになるはずです。
実際の効果 – 期待以上の安定性!
実際に試してみた結果、あっけないほど期待通りに動作してくれました!
- 手ブレや角度ズレがあっても問題なし
- 特別なマーカーや色分け不要
- 一度基準画像を作れば、あとは座標の修正不要
今では、複数台の環境センサーにカメラを固定設置し、日中定期的に写真を撮るだけでCO₂濃度を自動記録できるようになりました。施設スタッフの手間も大幅に削減でき、なぜもっと早くこの方法に気づけなかったのか、反省しきりです。
まとめ
カメラで画面を撮る作業は単純に見えて、微妙なズレが毎回発生します。そして、それはOCRの精度を大きく左右します。しかし、画像自体を「変換して揃える」というアプローチ(ORB特徴点マッチングとホモグラフィ変換)を使えば、びっくりするほど安定してOCRできるようになるのです。
同じような悩みを持っている方には、ぜひ一度この方法を試していただければと思います!
開発のご依頼も承りますので、ご要望があれば、お問い合わせからご連絡をお願い致します。
本日も最後までお読みいただきありがとうございました。
それでは、よいシステム開発を!