この記事では、以下の画像のようにある画像の中から最も大きい輪郭を抽出し、指定高さの上での物体距離を計測するプログラムをご紹介していきます。
応用すればカメラを使った実験データの分析などに活用できるはずです。
それではやっていきましょう。
※この作業をpythonというプログラミング言語を用いて実行していきます。インストールから始めたい方は以下からご覧ください。
必要なライブラリ
今回はpython上で以下の2つのライブラリを使って実行していきます。
〇openCV
〇numpy
numpyはAnacondaを使用すればあらかじめインストールされていますが、openCVは自分で追加インストールが必要です。
openCVのインストール方法については以下の記事で解説しています。
解像度の事前計測
今回は画像をつかって物体の距離を測っていくわけですが、そのためには画像上の1ピクセルが実際にはどのくらいの長さなのかを事前に把握しておく必要があります。
普通は計測したい物体を撮影した条件と同じ条件下で、物差しなんかを同じカメラ設定で撮影しておく必要があるわけですが、今回はその工程は割愛します。
この記事で使う以下の画像は1ピクセルが0.178mmであることが事前にわかっていますので、以降のプログラムではこの値を使っていきます。
ここまでで事前準備は完了です。
実際のプログラム作業に入っていきましょう。
物体の距離を計測するサンプルプログラム
今回は以下の画像のように上端から360ピクセル下の位置の横幅を計測してみようと思います。
以下がそのサンプルプログラムです。
#ライブラリインポート
import cv2
import numpy as np
#画像の解像度を指定
pixel=0.178 #mm/pixel
#長さを測る高さを指定
analysis_row=360
#画像の読み込み
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)
#指定行のデータを週出
bright_data=pic_thresh[analysis_row,:]
#長さを算出
num_pix=np.count_nonzero(bright_data)
length=round(num_pix*pixel,1)
print(str(length) + "mm")
こいつを実行すると以下の結果が得られました。
実際の長さは把握できておりませんが、まぁそれらしい結果は出ていますね。
サンプルプログラムの中で意味がわからないところがあれば、Twitterやコメント欄から質問してください。
おわりに
というわけで今回はpython-openCVを使って、画像上の物体の長さを計測する方法をご紹介しました。
データ分析の際などにぜひご活用ください。
また、今回は水平方向のみの距離しか計測できませんでしたが、次回は斜め方向にも計測できるようなプログラムをご紹介したいと思います。
ぜひお楽しみに!
〇関連記事
【python-openCV】画像にグリッド線(目盛り線)を入れる方法!
このように、私のブログでは様々なプログラミングスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村
それではまた!
Follow @HigashiSalary
コメント