今回はOpenCVで画像に図形を描画していきます。OpenCVでは、様々な図形を画像に重ね合わせて描画することができます。
図形を重ねることで以下のようなメリットがあります。
- 画像に情報を追加できる
- 検出した物体を囲える
今回も実装方法は簡単なので、是非試しながら読み進めてください^^
Pythonで実装する
使用する画像
今回も、この素敵なキツネの画像を使っていきます。
画像サイズが大きいのでリサイズして使用します。読み込みまでのコードは以下の通りです。
import cv2
path = "input/fox.jpg"
img = cv2.imread(path)
height, width = img.shape[:2]
#画像のリサイズ(1/4に)
img = cv2.resize(img,(round(width/4), round(height/4)))
線を描く
まずは線を描いていきます。線の描画にはcv2.line()を用います。
cv2.line(画像, 始点の座標, 終点の座標, 色, 太さ)
実際のコードを紹介します。
imageLine = img.copy()
#始点と終点
start = (200,80)
end = (450,80)
cv2.line(imageLine, start, end, (255, 255, 0), thickness=3)
cv2.imshow('Image Line', imageLine)
cv2.waitKey(0)
このコードでは、ある座標start(x1, y1)からend(x2, y2)までの線を描画します。色はBGRで指定します。順番に注意してください。線の太さは3としています。
実行すると、このように線が描画されます。
円を描く
円の描画には、cv2.circle()を用います。
cv2.circle(画像, 中心座標, 半径, 色, 線の太さ)
円の描画に必要な情報は中心の座標と半径です。実際に描画するコードは以下の通りです。
imageCircle = img.copy()
#円の中心座標
circle_center = (350,280)
#半径
radius =100
cv2.circle(imageCircle, circle_center, radius, (0, 0, 255), thickness=3, lineType=cv2.LINE_AA)
cv2.imshow("Image Circle",imageCircle)
cv2.waitKey(0)
lineTypeでは線のタイプを指定します(任意のパラメータ)。結果は以下のようになります。
塗りつぶしの円を描く
線の太さ(thickness)を-1に指定することで、塗りつぶした円を描画することができます。
cv2.circle(imageCircle, circle_center, radius, (0, 0, 255), thickness=-1, lineType=cv2.LINE_AA)
長方形を描く
次は長方形を描画します。長方形の描画にはcv2.rectangle()を用います。
cv2.rectangle(画像, 始点, 終点, 色, 線の太さ)
始点では長方形の(top, left)の位置を指定します。終点では(bottom, right)を指定します。
imageRectangle = img.copy()
#始点
start_point =(250,185)
#終点
end_point =(430,385)
cv2.rectangle(imageRectangle, start_point, end_point, (0, 0, 255), thickness= 3, lineType=cv2.LINE_8)
cv2.imshow('imageRectangle', imageRectangle)
cv2.waitKey(0)
実行した結果は以下のようになります。
長方形が描画されました。
楕円を描く
最後に楕円を描画していきます。楕円の描画にはcv2.elipse()を用います。
cv2.elipse(画像, 中心座標, 各軸方向への長さ, 角度, 描画開始角度, 描画終了角度, 色, 線の太さ)
引数がたくさんありますが、1つずつ解説していきます。
中心座標の指定は円の描画のときと同じです。各軸方向への長さとは、長軸と短軸それぞれの長さのことです。
角度は楕円そのものの角度を指します。0にすると縦方向に長い楕円、90とすると横方向に長い楕円となります。
描画開始角度、終了角度は、線を描画する角度を0~360°(または0~-360°)までで指定します。例えば開始を0°、終了を360°とした場合、全円を描画でき、終了を180°とした場合は半円を描画できます。
実際に描画したときのコードは以下の通りです。
imageEllipse = img.copy()
#楕円の中心
ellipse_center = (350,280)
#軸方向の長さ
axis1 = (100,50)
cv2.ellipse(imageEllipse, ellipse_center, axis1, 0, 0, 360, (255, 0, 0), thickness=3)
cv2.imshow('ellipse Image',imageEllipse)
cv2.waitKey(0)
楕円を描画することができました。
OpenCVの学習におすすめ書籍
PythonでOpenCV始めてみようという方におすすめなのが以下書籍です。実装例も豊富なので、1からコードを書かずとも学習を進めることができます。
オライリーの1冊は読み物というより辞書としての利用におすすめです。お値段結構しますが、細かい情報までしっかりと詰め込まれています。
まとめ
画像に図形を重ねて描画することは、物体検知などでも良く用いられます。情報を伝えるための便利な手段なので、是非実装してみてください^^
OpenCVの基礎を身につけるためのロードマップは以下を参考にしてください。
ではでは👋