OpenCVで使われるrectangleとは?各引数の意味をわかりやすく解説!?
今回はOpenCVで使われるrectangleに関して、rectangleの各引数の意味をわかりやすく解説致します。rectangle関数を利用したい、つい最近OpenCVを使い始めた方はおすすめです。ぜひ最後までご覧ください。
執筆者 - おすすめの記事3選
OpenCVで使われるrectangleとは?
OpenCVで使われるrectangleとは、2点の座標を与えることで、画像内へ矩形を描画する関数です。
具体的なイメージとしては、以下の「rectangle関数のイメージ画像」の赤色で描画される箇所を、イメージしてもらうと良いでしょう。
【rectangle関数のイメージ画像】
OpenCVで使われるrectangle関数の定義
rectangle関数は、
1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# rectangle関数 : 2点の座標を与えることで、画像内へ矩形を描画する関数
5# rectangle関数公式ドキュメント : https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html#ga07d2f74cadcf8e305e810ce8eed13bc9
6
7# 第一引数(必須) : 多次元配列(画像情報)
8
9###############################
10# 第二引数(必須) : 2点の座標の1つ。tuple型。
11# tuple型とは? : https://atmarkit.itmedia.co.jp/ait/articles/1906/14/news015.html
12# 例) : (100, 150) ⏩ 2点の座標の1つをx座標100px, y座標150pxとする。
13# ※ 第二引数を指定する際は、画像の左上角が(0, 0)であることに留意する。
14###############################
15
16###############################
17# 第三引数(必須) : 2点の座標のもう1つ。tuple型。
18# tuple型とは? : https://atmarkit.itmedia.co.jp/ait/articles/1906/14/news015.html
19# 例) : (70, 80) ⏩ 2点の座標のもう1つをx座標70px, y座標80pxとする。
20# ※ 第三引数を指定する際は、画像の左上角が(0, 0)であることに留意する。
21###############################
22
23###############################
24# 第四引数(必須) : 矩形の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
25# 例) : (255, 0, 0) ⏩ 矩形の色を青色にする。
26# 以下のサイトを利用して、矩形の色を考えると良いでしょう。
27# https://www.peko-step.com/tool/tfcolor.html
28###############################
29
30# <第五引数以降(順不同、任意)>
31# thickness : 矩形の枠線の太さ(px)を指定する。int型。デフォルト(thicknessを指定しない場合)は1が設定される。
32# 0を指定する場合、デフォルト(thicknessを指定しない場合)と同じ(1)になる。
33# 負の整数(-1, -3など)を与えると、枠線で囲まれる矩形の、中の塗りつぶしを行います。
34# 塗りつぶしとは? : https://www.weblio.jp/content/%E5%A1%97%E3%82%8A%E6%BD%B0%E3%81%99#:~:text=%E3%81%AC%E3%82%8A%E2%80%90%E3%81%A4%E3%81%B6%E3%83%BB%E3%81%99%E3%80%90%E5%A1%97%E6%BD%B0%E3%80%91&text=%E2%91%A0%20%E4%B8%8B%E5%9C%B0%E3%81%8C%E8%A6%8B%E3%81%88%E3%81%AA%E3%81%84,%E4%B8%80%E9%9D%A2%E3%81%AB%E5%A1%97%E3%82%8B%E3%80%82&text=%E2%91%A1%20%E7%89%A9%E4%BA%8B%E3%82%92%E8%A6%86%E3%81%84%E3%81%8B%E3%81%8F%E3%81%99%E3%80%82
35# 例) thickness=4 ⏩ 矩形の枠線の太さを4pxとする。
36
37# lineType : 矩形の枠線の種類を指定する。cv2.LINE_4(4連結)、cv2.LINE_8(8連結)、cv2.LINE_AA(アンチエイリアス)のどれかを指定する。
38# デフォルト(lineTypeを指定しない場合)はcv2.LINE_8が設定される。
39# アンチエイリアスとは? : https://e-words.jp/w/%E3%82%A2%E3%83%B3%E3%83%81%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9.html
40# cv2.LINE_4(4連結)、cv2.LINE_8(8連結)は、ブレゼンハムのアルゴリズムを用いて枠線を描画する。
41# ブレゼンハムのアルゴリズムとは? : https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AC%E3%82%BC%E3%83%B3%E3%83%8F%E3%83%A0%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
42# また太い矩形の枠線(thicknessの値が大きい)の端は丸く描画されます。
43
44# shift : 第二引数、第三引数の座標位置をずらすために利用します。int型(0以上の整数)。デフォルト(shiftを指定しない場合)は0が設定される。
45# (x * 2^(-shift), y * 2^(-shift))の結果を、第二引数、第三引数の値とする。
46# 例) 第二引数を(50, 100)、shiftへ1を指定すると、第二引数を(25, 50)に変更される。
47
48cv2.rectangle(img, (整数, 整数), (整数, 整数), (0~255の整数, 0~255の整数, 0~255の整数), thickness=整数, lineType=(cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA)のどれか, shift=0以上の整数)
で定義されます。
例えば以下のようなコードを作成すると、
1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('./xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12 sys.exit("Could not read the image.")
13
14# 第一引数(必須) : 多次元配列(numpy.ndarray)
15# 第二引数(必須) : 2点の座標の1つ。tuple型。
16# 第三引数(必須) : 2点の座標のもう1つ。tuple型。
17# 第四引数(必須) : 矩形の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
18# <第五引数以降(順不同、任意)>
19# thickness : 矩形の枠線の太さ(px)を指定する。int型。デフォルト(thicknessを指定しない場合)は1が設定される。
20# 負の整数(-1, -3など)を与えると、枠線で囲まれる矩形の、中の塗りつぶしを行います。
21cv2.rectangle(img, (400, 300), (200, 180), (255, 0, 0), thickness=-1)
22
23# imwrite : 画像の保存を行う関数
24# 第一引数 : 保存先の画像ファイル名
25# 第二引数 : 多次元配列(numpy.ndarray)
26# <第二引数の例>
27# [
28# [
29# [234 237 228]
30# ...
31# [202 209 194]
32# ]
33# [
34# [10 27 16]
35# ...
36# [36 67 46]
37# ]
38# [
39# [34 51 40]
40# ...
41# [50 81 60]
42# ]
43# ]
44# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
45cv2.imwrite('output.jpg', img)
以下の画像のように、画像が描画されます。
imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。
imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。
矩形の枠線の色と塗りつぶし色を変えたい場合
矩形の枠線の色と塗りつぶし色を変えたい場合は、先に塗りつぶし処理を行って、次に同じ位置に枠線を描画すると上手くいきます。一度に複数指定(塗りつぶしと枠線の描画)することは出来ません。
例えば以下のようなコードを作成すると、
1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('./xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12 sys.exit("Could not read the image.")
13
14# 第一引数(必須) : 多次元配列(numpy.ndarray)
15# 第二引数(必須) : 2点の座標の1つ。tuple型。
16# 第三引数(必須) : 2点の座標のもう1つ。tuple型。
17# 第四引数(必須) : 矩形の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
18# <第五引数以降(順不同、任意)>
19# thickness : 矩形の枠線の太さ(px)を指定する。int型。デフォルト(thicknessを指定しない場合)は1が設定される。
20# 負の整数(-1, -3など)を与えると、枠線で囲まれる矩形の、中の塗りつぶしを行います。
21cv2.rectangle(img, (400, 300), (200, 180), (255, 0, 0), thickness=-1)
22cv2.rectangle(img, (400, 300), (200, 180), (0, 0, 255), thickness=4)
23
24# imwrite : 画像の保存を行う関数
25# 第一引数 : 保存先の画像ファイル名
26# 第二引数 : 多次元配列(numpy.ndarray)
27# <第二引数の例>
28# [
29# [
30# [234 237 228]
31# ...
32# [202 209 194]
33# ]
34# [
35# [10 27 16]
36# ...
37# [36 67 46]
38# ]
39# [
40# [34 51 40]
41# ...
42# [50 81 60]
43# ]
44# ]
45# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
46cv2.imwrite('output.jpg', img)
以下の画像のように、画像が描画されます。
まとめ
- OpenCVで使われるrectangleとは、2点の座標を与えることで、画像内へ矩形を描画する関数です。
- 矩形の枠線の色と塗りつぶし色を変えたい場合は、先に塗りつぶし処理を行って、次に同じ位置に枠線を描画すると上手くいく。
参考文献
- 座標とは?
- 矩形とは?
- rectangle関数公式ドキュメント
- tuple型とは?
- 塗りつぶしとは?
- アンチエイリアスとは?
- ブレゼンハムのアルゴリズムとは?
- OpenCVで使われるrectangle関数に関するサンプルコード