はじめに
以前、直線を描画するcv2.line
関数の使い方をこちらの投稿で紹介しました。
今回は四角形の描画方法について解説します。
四角形は顔認識などのオブジェクト認識の結果のマーキングや、オブジェクトトラッキングによって追跡されたオブジェクトの位置情報を利用してオブジェクトの動きや位置の変化を可視化、領域の可視化などに用いられます。
四角形を描画
四角形を描画するためにはcv2.rectangle
関数を使用します。
cv2.rectangle関数の構文
線分は画像の境界でクリップされます。
整数座標を持つ非アンチエイリアス ラインの場合、8 連結または 4 連結 Bresenham アルゴリズムが使用されます。太い線は、丸みのある端で描かれます。アンチエイリアス処理された線は、ガウス フィルタリングを使用して描画されます。
引数
名称 | 説明 |
入力画像(必須) | 入力画像データ |
pt1(必須) | 四角形の頂点 |
pt2(必須) | pt1の対角の四角形の頂点 |
color(必須) | 線の色 |
thickness(オプション) | 線の太さ(1以上、デフォルト:"1") |
lineType(オプション) | 線の種類(デフォルト:cv.2LINE_8) |
shift(オプション) | 座標の小数ビット数(デフォルト:"0") |
使い方
引数のlineTypeはLineTypesに示す4種類のいずれかとなります。デフォルトはcv2.LINE_8
です。
thicknessにcv2.FILLED
を設定すると四角形内を塗りつぶしとなります。
線の種類 | 説明 |
cv2.FILLED | 塗りつぶし |
cv2.LINE_4 | 4 連結 |
cv.2LINE_8 | 8 連結(デフォルト) |
cv2.LINE_AA | アンチエイリアス処理された線 |
上の図に描画の例を示します。
一番上が塗りつぶし、真ん中が線幅=5、一番下が線幅=2、線の種類は全てアンチエイリアスの設定としています。
引数のshiftを設定すると、pt1とpt2の座標に対して(2^shift)で割った値の座標で描画されます。
以下に示す図は一番上がshift=2、真ん中がshift=1、一番下がshift指定なし(shift=0)の描画の結果です。
上記の結果を出力するサンプルコードが以下となります。
import cv2 import numpy as np window = "cv2.rectangle" window_shift = "cv2.rectangle:shift" # 描画する画像をサイズを指定 width = 800 height = 500 size = height, width, 3 # 描画する四角形の幅と高さ rect_w = 600 rect_h = 75 # 白で塗りつぶした画像を作成 image = np.full(size, (255, 255, 255), dtype=np.uint8) # 四角形を線幅と線の色を変えて描画 cv2.rectangle(image, (100, 50), (100+rect_w, 50+rect_h), (255, 0, 0), cv2.FILLED, cv2.LINE_AA) cv2.rectangle(image, (100, 200), (100+rect_w, 200+rect_h), (0, 255, 0), 5, cv2.LINE_AA) cv2.rectangle(image, (100, 350), (100+rect_w, 350+rect_h), (255, 0, 255), 2, cv2.LINE_AA) # 白で塗りつぶした画像を作成 image_shift = np.full(size, (255, 255, 255), dtype=np.uint8) # 上記の3つ目の四角形対して、shiftを設定して描画(shift=0(設定なし), shift=1, shift=2) cv2.rectangle(image_shift, (100, 350), (100+rect_w, 350+rect_h), (255, 0, 255), 2, cv2.LINE_AA) cv2.rectangle(image_shift, (100, 350), (100+rect_w, 350+rect_h), (255, 0, 255), 2, cv2.LINE_AA, 1) cv2.rectangle(image_shift, (100, 350), (100+rect_w, 350+rect_h), (255, 0, 255), 2, cv2.LINE_AA, 2) # 結果の表示 cv2.imshow(window, image) cv2.moveWindow(window, 0, 0) cv2.imshow(window_shift, image_shift) cv2.moveWindow(window_shift, width, 0) cv2.waitKey(0) cv2.destroyAllWindows()
おわりに
cv2.rectangle
関数は直線を描画するcv2.line
関数と引数の共通項が多いので、どちらか一つ理解してしまえば使いこなせる様になります。
基本図形であり、登場する場面も少なくないので、使い方の振り返りなどに本記事を活用して頂けると嬉しいです。
最後までご覧いただきありがとうございました。
■(広告)OpenCVの参考書としてどうぞ!■
参考リンク
OpenCV: Drawing Functions
Draws a simple, thick, or filled up-right rectangle.