【Python・OpenCV】四角形を描画するには(cv2.rectangle)

※当サイトではアフィリエイト広告を利用しています

Python プログラミング 画像処理

【Python・OpenCV】四角形を描画するには(cv2.rectangle)

2023-07-10

はじめに

以前、直線を描画するcv2.line関数の使い方をこちらの投稿で紹介しました。
今回は四角形の描画方法について解説します。
四角形は顔認識などのオブジェクト認識の結果のマーキングや、オブジェクトトラッキングによって追跡されたオブジェクトの位置情報を利用してオブジェクトの動きや位置の変化を可視化、領域の可視化などに用いられます。

四角形を描画

四角形を描画するためにはcv2.rectangle関数を使用します。

cv2.rectangle関数の構文

cv2.rectangle(入力画像, pt1, pt2, color[, thickness[, lineType[, shift]]])

線分は画像の境界でクリップされます。
整数座標を持つ非アンチエイリアス ラインの場合、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の参考書としてどうぞ!■

参考リンク

-Python, プログラミング, 画像処理
-