この記事では、以下に示すように、画像内にある物体に対して、指定した位置から、指定した方向に向かって距離を計測する方法をご紹介していきます。
基本的には前回記事を応用していくことになりますので、前回記事を読んでからの方が理解が深まるはずです。
興味があればまずは以下からご覧ください。
それではさっそくやっていきましょう。
※この作業をpythonというプログラミング言語を用いて実行していきます。インストールから始めたい方は以下からご覧ください。
必要なライブラリインストール
今回はpython上で以下の2つのライブラリを使って実行していきます。
〇openCV
〇numpy
numpyはAnacondaを使用すればあらかじめインストールされていますが、openCVは自分で追加インストールが必要です。
openCVのインストール方法については以下の記事で解説しています。
事前準備:画像の解像度を取得しておく
ここは前回の記事と全く同じです。
この記事で使う以下の画像は1ピクセルが0.178mmであることが事前にわかっていますので、以降のプログラムではこの値を使っていきます。
事前準備:計測始点、方向を確認する
ここからは実際のプログラミング作業が入ってきます。
まずはそのコードをご紹介します。
#ライブラリインポート
import cv2
import numpy as np
import math
#画像の解像度を指定
pixel=0.178 #mm/pixel
#長さを測る原点、方向を指定
x0,y0=229,239
dx,dy=646,386
clen=450
#検査方向の傾きを算出
a=(dy-y0)/(dx-x0)
#画像の読み込み
picgray=cv2.imread('mouse.jpg',cv2.IMREAD_COLOR)
#始点、方向をプロット⇒出力
cv2.circle(picgray, (x0, y0), 10, (0,0,255), thickness=-1)
cv2.arrowedLine(picgray, (x0, y0), (x0+clen, y0+int(a*clen)), (0, 0, 255), thickness=4)
cv2.imwrite('position.jpg',picgray)
こいつを実行すると以下の画像が出力されます。
この画像を作る理由としては、距離を測定する際の始点と方向が、あなたの意図するものと一致しているかを確認するためのものです。
先ほどのコードの中にでてきた以下の変数を調整し、距離を測定する際の始点、方向を調整してみましょう。
x0,y0=229,239
dx,dy=646,386
(clenは大きくすると矢印の長さが長くなります。)
※今回はこの数値のまま実行していきます。
なお、画像内の座標を確認したい方は、以下の記事でやり方をご紹介しています。
興味があればまずはこちらからご覧ください。
【python-openCV】クリック位置の座標を画像内に表示する方法
距離計測のサンプルコード
事前調整が終わったらいよいよ距離の測定に入っていきます。
以下がその実行コードです。
#ライブラリインポート
import cv2
import numpy as np
import math
#画像の解像度を指定
pixel=0.178 #mm/pixel
#長さを測る原点、方向を指定
x0,y0=229,239
dx,dy=646,386
clen=450
#検査方向の傾きを算出
a=(dy-y0)/(dx-x0)
#画像の読み込み
picgray=cv2.imread('mouse.jpg',cv2.IMREAD_GRAYSCALE)
#二値化データの作成
ret, thresh = cv2.threshold(picgray, 5, 255, cv2.THRESH_BINARY)
#輪郭抽出
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)
max_cnt =max(contours, key=lambda x: cv2.contourArea(x))
#輪郭内を塗りつぶし
pic_thresh = cv2.drawContours(picgray, [max_cnt], -1, 255, -1)
#検査開始
i=0
while pic_thresh[y0+int(a*i),x0+i]<1:
i=i+1
j=i
while pic_thresh[y0+int(a*j),x0+j]==255:
j=j+1
xp=j-i
yp=a*(j-i)
deltap=math.sqrt(xp*xp+yp*yp)
deltal=round(deltap*pixel,2)
print(str(deltal)+'mm')
こいつを実行すると以下の結果が得られました。
正解かどうかは検証しようがないのでわかりませんが、それらしい数値にはなっていますね。
というわけで、問題なくやりたいことが実行できました。
おわりに
というわけで今回はpython-openCVを使って、画像上の物体の長さを始点&方向を指定して計測する方法をご紹介しました。
データ分析の際などにぜひご活用ください。
〇関連記事
【python-openCV】画像にグリッド線(目盛り線)を入れる方法!
このように、私のブログでは様々なプログラミングスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村
それではまた!
Follow @HigashiSalary
コメント