こんにちは、タナカです。
この記事では、画像の円周上の座標を求める方法を説明します。
この記事の内容
- 画像上にある円の円周上の座標を取得する方法がわかる
1. 画像の軸を理解する
画像の軸は左上を原点とし、右方向に+x, 下方向に+yとなっています。今回、(x, y) = (150, 150)を中点とする半径50pxの円を考えます。
角度に応じてこの円周上の座標を取得する方法を説明します。
2. 円周上の座標を取得する
円周上の座標は下図の三角形を考えると求めることができます。特に、円の中点を原点として考えるとわかりやすいです。
画像はx軸を0°とし、右回りに+、左周りに-となっています。例えば、角度10°の場合は左図のような三角形になり、角度-120°の場合は右図のような三角形になります。
円周上の座標は、中点からx方向にrcosθ移動し、y方向にrsinθ移動したところになります。半径rの大きさや角度θに応じて、その移動量が変わることになります。
3. 円周上の座標を取得するコード
円周上の座標を求めるコードはこのようになります。コードの詳細については、コメントをご確認ください。
import numpy as np
import matplotlib.pyplot as plt
import cv2
import math
height = 300
width = 300
# 真っ白な300x300の画像
white = np.ones([height, width, 3], dtype = np.uint8) * 255
# 円の中点
p = (150, 150)
# 半径r[px]
r = 50
# 円の描画
cv2.circle(white, p, 1, (255, 0, 0), -1)
cv2.circle(white, p, r, (255, 0, 0), 1)
# 角度θ[°]
theta = -120
# degree → rad に変換
rad = np.deg2rad(theta)
# 移動量を算出
rsinθ = r * np.sin(rad)
rcosθ = r * np.cos(rad)
# 円周上の座標
t = np.array([p[0] + rcosθ, p[1] + rsinθ])
# 円周上の点を描画
cv2.circle(white, (int(t[0]), int(t[1])), 1, (0, 0, 0), -1)
# 画像の可視化
plt.imshow(white)
plt.show()
np.sin()とnp.cos()の引数には、角度を「°」ではなく「rad」を入れる必要があるため、np.deg2rad()で「rad」に変換しています。
まとめ
円周上の座標を求める方法を備忘録としてまとめました。
画像のx軸とy軸の方向を間違えやすいので、ご注意ください。