【Python】OpenCVで画像に図形を描画する

今回は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)を指定します。

↑top↓bottom←left→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の基礎を身につけるためのロードマップは以下を参考にしてください。

ではでは👋