2021年1月2日土曜日

【OpenCV】長方形を描画するrectangle

 画像処理ライブラリOpenCVで長方形を描画するrectangleについて説明する。

OpenCVを使うには次のようにインポートが必要。
import cv2



1. 長方形を描画するrectangle

長方形を描画するrectangleの書式は以下の通り。座標の指定方法により2種類の書式がある。

cv.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]	)
cv.rectangle(img, rec, color[, thickness[, lineType[, shift]]] )

引数の意味は以下の通り。

引数 意味
img 長方形を描画する画像
pt1, pt2 長方形の角座標。(x, y)のタプルで指定
rec 長方形の角座標と長方形の幅・高さによる座標指定。(x, y, 幅, 高さ)のタプルで指定
color 長方形の色。(b, g, r)で指定。グレイスケールの場合はbrightnessで指定。
thickness(省略可) 長方形の枠線の幅。-1の場合は塗りつぶしになる
lineType(省略可) cv2.FILLED
cv2.LINE_8(8連結、デフォルト)
cv2.LINE_4(4連結)
cv2.LINE_AA(アンチエイリアス処理)
shift(省略可) 座標を小数表示する場合に使用。指定した場合
(x, y)が
(x/2^shift, y/2^shift) となる。


幅400高さ300の白画像を作成し、左上座標x=150,y=100、右下座標x=350,y=200による線の幅10pxの赤い長方形を描画する例。線の中心位置が指定した座標となる。また外側の角は自動で丸く描かれる。

import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)
img[:, :, :] = 255

cv2.rectangle(img, (150, 100), (350, 200), (0,0,255), 10)

cv2.imwrite('rectangle.png', img)

実行結果




引数recにより座標と長方形の幅・高さを指定する場合。長方形の左上の座標(150, 100)と長方形の幅200、長方形の高さ100を指定している。

import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)
img[:, :, :] = 255

cv2.rectangle(img, (150, 100, 200, 100), (0,0,255), 10)

cv2.imwrite('rectangle.png', img)

実行結果




引数thicknessを-1とすると塗りつぶされた長方形が描かれる。

import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)
img[:, :, :] = 255

cv2.rectangle(img, (150, 100), (350, 200), (0,0,255), -1)

cv2.imwrite('rectangle.png', img)

実行結果



2. 引数lineTypeを指定した場合

lineTypeを指定すると線の種類を選択でき、長方形の角の形状に影響する。
cv2.FILLED
cv2.LINE_8(8連結、デフォルト)
cv2.LINE_4(4連結)
cv2.LINE_AA(アンチエイリアス処理)
以下のような違いがある。

import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)
img[:, :, :] = 255

cv2.rectangle(img, (50, 50, 400, 400), (0,0,255), 40, lineType=cv2.FILLED)
cv2.rectangle(img, (100, 100, 400, 400), (0,0,255), 40, lineType=cv2.LINE_4)
cv2.rectangle(img, (150, 150, 400, 400), (0,0,255), 40, lineType=cv2.LINE_8)
cv2.rectangle(img, (200, 200, 400, 400), (0,0,255), 40, lineType=cv2.LINE_AA)

cv2.imwrite('rectangle.png', img)

左からcv2.FILLEDcv2.LINE_4cv2.LINE_8cv2.LINE_AA
cv2.LINE_AAでは中間色を使ったアンチエイリアス処理が施され外側の角のギザギザが低減される。

実行結果



3. 引数shiftを指定した場合

shiftを指定すると座標が2^shiftで割られた値となる。つまりshift=1の場合1/2、shift=2の場合1/4、shift=3の場合1/8・・・となる。
座標には整数しか与えられないが、shiftにより小数に変換できる。線の太さは変わらない。

import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)
img[:, :, :] = 255

cv2.rectangle(img, (150, 100), (350, 200), (0,0,255), 10)
cv2.rectangle(img, (150, 100), (350, 200), (0,0,255), 10, shift=1)
cv2.rectangle(img, (150, 100), (350, 200), (0,0,255), 10, shift=2)
cv2.rectangle(img, (150, 100), (350, 200), (0,0,255), 10, shift=3)

cv2.imwrite('rectanglesh.png', img)

実行結果。左からshift=3、shift=2、shift=1、shiftなし。



4. リファレンス

OpenCV > Drawing Functions > rectangle()

使用したバージョン:Python 3.7.0 / OpenCV 4.0.0

0 件のコメント:

コメントを投稿