見出し画像

アナログメーター 1(直線検出)

以前の記事に書いたように「機械式アナログメーターの指示値を読み取る」アプリケーションに挑戦中です。

調べてみると、いろいろと実施例がありますし、ディープラーニングまで使う必要が無い課題のようです。初挑戦には手頃なのかも知れませんし、挫折するかも知れません。

まずは携帯のカメラで撮影した画像1枚を使い、味見的にどこまでやれそうか感触を確認しています。

今回は機械式アナログメーター(ガスボンベの圧力ゲージ)の指針の向きを検出する目的で、openCVによるホフ変換の直線検出を試しました。
タイトル画像の赤い線は検出結果です。

いつもながら、Webページを参考にしています。
今回は、こちらのページを主に参考にしました。
ありがとうございます。

Google Colaboratory

自分のPCに様々な環境を作ることなく、いろいろ試せるのでGoogle Colaboratory で実験しています。

ディレクトリー構造は以下の通りです。

My Drive/Colab/meter1  今回のワークディレクトリ
My Drive/Colab/meter1/images1/CVtest3.jpg  サンプル画像

サンプル画像は以下です。

ColaboratoryにMy Drive をマウントするために、以下を実行して指示に従います。

# drive マウント
from google.colab import drive
drive.mount('/content/drive/')
%cd "/content/drive/My Drive/Colab/meter1"
%ls


ソースコード

次のソースコードで、タイトル画像の結果を得ています。

# cv2.HoughLines() 関数
import cv2
import numpy as np
%cd "/content/drive/My Drive/Colab/meter1"
img = cv2.imread('./images1/CVtest3.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,200,apertureSize = 3)
cv2.imwrite('houghlines2.jpg',edges)
minn = 180
# 第1引数は入力画像であり,2値画像でなければなりません.
# 第2,3引数にはそれぞれ \rho と \theta の精度
# 第4引数は,直線とみなされるのに必要な最低限の投票数を意味するしきい値です.投票数は直線上の点の数に依存する
lines = cv2.HoughLines(edges,1,np.pi/180,minn)
print(len(lines))
for i in range(len(lines)):
   for rho,theta in lines[i]:
       a = np.cos(theta)
       b = np.sin(theta)
       x0 = a*rho
       y0 = b*rho
       x1 = int(x0 + 1000*(-b))
       y1 = int(y0 + 1000*(a))
       x2 = int(x0 - 1000*(-b))
       y2 = int(y0 - 1000*(a))
       cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
cv2.imwrite('houghlines3.jpg',img)

以下のファイルを出力します。

My Drive/Colab/meter1/houghlines2.jpg エッジ画像
My Drive/Colab/meter1/houghlines3.jpg タイトル画像

エッジ画像は以下の結果でした。

画像1

エッジ協調、ホフ変換による直線検出共に基本的な考え方を学んで自ら関数を作ることも可能な範囲だと思いますが、「openCV を使いました」と言われた方が安心ですよね。(悲しい気もするけど事実です。)

openCV いろいろ楽しめそうです。


追伸:
note のマガジンって21個までしか作れないんですね。
そうとは知らず、無駄使いしてしまいました。
なんとか整理しないと・・・



出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。