【python画像計測】画像内で指定した3点から角度を算出する方法!

 

この記事では、以下の画像のように画像内で指定した3点がなす角度を算出する方法をご紹介していきます。

画像から角度を算出するという作業概要図

 

今回は以下のような棒が2本だけ書いてあるだけの画像を使って解説していきますが、基本的にはどんな画像でも適用可能です。

それではさっそくやっていきましょう。

今回使用するサンプル画像の紹介

 

※この作業をpythonというプログラミング言語を用いて実行していきます。

インストールから始めたい方は以下からご覧ください。

 

スポンサーリンク

必要なライブラリ一覧

今回は以下のライブラリを使用していきます。

〇openCV

〇matplotlib

〇numpy

〇math

 

openCV以外 はAnacondaを使用すればあらかじめインストールされていますが、openCVは自分で追加インストールが必要です。

 

openCVのインストール方法については以下の記事で解説しています。

 

スポンサーリンク

なす角を計算したい3点のピクセル位置を確認

今回なす角を計算するうえで、まずは画像内で角度を測りたい3点を指定してあげる必要があります。

 

とはいえ、画像を見ただけでどこが何ピクセル目かなんてわかるはずがありませんから、まずは測りたい3点のピクセルはどこなのかを確認する必要があります。

 

ということで、まずはベースとなる画像を読み込み、そこに3つのプロット点を描写しながら図りたい場所のピクセル位置を確認していきましょう。

 

※以下の記事では画像内の位置座標を簡単に確認する方法をご紹介しています。興味があればこちらもあわせてご覧ください。

【python-openCV】クリック位置の座標を画像内に表示する方法

 

そのためのコードは以下の通りです。

import cv2
import matplotlib.pyplot as plt
import math
import numpy as np
file_name='sample.jpg'
img=cv2.imread(file_name,cv2.IMREAD_GRAYSCALE)

#まずはここの値を変えながら測りたい場所を指定する
#pos0
x0,y0=386,422
#pos1
x1,y1=715,480
#pos2
x2,y2=815,222

cv2.circle(img,center=(x0,y0),radius=5,color=255,thickness=3)
cv2.circle(img,center=(x1,y1),radius=5,color=255,thickness=3)
cv2.circle(img,center=(x2,y2),radius=5,color=255,thickness=3)
plt.imshow(img,cmap = "gray")

 

まずはx0,y0,x1,y1,x2,y2の値を変えながらあなたが測りたい場所はどこなのかを試行錯誤で探していきましょう。

 

私の場合は先ほどのコードを実行すると以下の結果が得られました。

角度計算したい3点の位置を確認した結果

すこしわかりにくいですが、3つの白丸が表示されていることが確認できますね。

 

まずはこの出力画像を確認しながらあなたが角度を測りたい3点の座標を探していきましょう。

 

なお、今回はpos0(x0,y0)を角度計算を行う際の中心座標としています。

座標を指定する際の注意点を解説

3点うまくプロットできれば良いというわけではありませんので、順番にはご注意ください。

 

スポンサーリンク

画像内指定位置のなす角を算出する方法

それでは図りたい場所がわかったところで、実際の角度計測作業に入っていきましょう。

 

先ほどのコードに追記する形で記述しています。

import cv2
import matplotlib.pyplot as plt
import math
import numpy as np
file_name='sample.jpg'
img=cv2.imread(file_name,cv2.IMREAD_GRAYSCALE)

#まずはここの値を変えながら測りたい場所を指定する
#pos0
x0,y0=386,422
#pos1
x1,y1=715,480
#pos2
x2,y2=815,222

cv2.circle(img,center=(x0,y0),radius=10,color=255,thickness=3)
cv2.circle(img,center=(x1,y1),radius=10,color=255,thickness=3)
cv2.circle(img,center=(x2,y2),radius=10,color=255,thickness=3)
plt.imshow(img,cmap = "gray")

vec1=[x1-x0,y1-y0]
vec2=[x2-x0,y2-y0]
absvec1=np.linalg.norm(vec1)
absvec2=np.linalg.norm(vec2)
inner=np.inner(vec1,vec2)
cos_theta=inner/(absvec1*absvec2)

theta=math.degrees(math.acos(cos_theta))
print('deg='+str(round(theta,2)))

 

基本的にやっていることとしては、中心位置(pos0)からその他の位置(pos1,pos2)へのベクトルを算出し、それらのベクトルと内積の公式を使うことによってなす角を算出しているだけです。

 

スポンサーリンク

サンプルコードの実行結果

それでは先ほどのサンプルコードを実行してみましょう。

ちなみに今回使っている画像は以下のように作成段階で2本の棒のなす角度は35degになるように作っています。

サンプル画像の正解なす角度を説明

 

ですので、さきほどのプログラムで35degが算出できていれば成功というわけですね。

 

それでは実行してみます。

実行すると以下の結果が出力されました。

サンプルコードでなす角度を算出した結果

残念ながらぴったり35degは算出できませんでしたね。

まぁここは解像度の問題なんかもありますので仕方ないですね。

 

いずれにせよ、かなり精度よく計算できることは確認できました。

 

なお今回使っているスキルは以下で詳細解説しています。

興味があればぜひこちらもご覧ください。

【python-numpy】指定した3点間での’なす角’を計算する方法!

 

スポンサーリンク

おわりに

というわけで今回はpython上で、画像内で指定した3点がなす角度を算出する方法をご紹介しました。

実験データの分析の際などにぜひご活用ください。

 

このように、私のブログでは様々なスキルを紹介しています。

過去記事一覧

 

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村 IT技術ブログへ
にほんブログ村

それではまた!

コメント

タイトルとURLをコピーしました