OpenCVで使われるfillConvexPolyとは?関数の定義・利用法を解説
今回はOpenCVで使われるfillConvexPolyに関して、関数の定義から利用法まで徹底解説致します。fillConvexPoly関数を学びたい、OpenCV始めたての方はおすすめです。ぜひ最後までご覧ください。
執筆者 - おすすめの記事3選
OpenCVで使われるfillConvexPolyとは?
OpenCVで使われるfillConvexPolyとは、複数の座標を結ぶことで、画像内へ多角形を描画する関数です。
具体的なイメージとしては、以下の「fillConvexPoly関数のイメージ画像」の赤色で描画される箇所を、イメージしてもらうと良いでしょう。
【fillConvexPoly関数のイメージ画像】
OpenCVで使われるfillConvexPoly関数の定義
fillConvexPoly関数は、
1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# numpyを利用する宣言を行う。
5import numpy as np
6
7# fillConvexPoly関数 : 複数の座標を結ぶことで、画像内へ多角形を描画する関数。
8# fillConvexPoly関数 - 公式ドキュメント : https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html#ga9bb982be9d641dc51edd5e8ae3624e1f
9
10# 第一引数(必須) : 多次元配列(画像情報)
11
12###############################
13# 第二引数(必須) : 複数の座標。numpy.ndarray型。
14# numpy.ndarray型とは? : https://note.nkmk.me/python-list-array-numpy-ndarray/
15# 例) : np.array([(100, 150), (50, 200), (30, 20)]) ⏩ (x座標100px, y座標150px)と(x座標50px, y座標200px)を結ぶ。(x座標50px, y座標200px)と(x座標30px, y座標20px)を結ぶ。(x座標30px, y座標20px)と(x座標100px, y座標150px)を結ぶ。
16# ※ 第二引数を指定する際は、画像の左上角が(0, 0)であることに留意する。
17###############################
18
19###############################
20# 第三引数(必須) : 多角形の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
21# tuple型とは? : https://atmarkit.itmedia.co.jp/ait/articles/1906/14/news015.html
22# 例) : (255, 0, 0) ⏩ 多角形の色を青色にする。
23# 以下のサイトを利用して、多角形の色を考えると良いでしょう。
24# https://www.peko-step.com/tool/tfcolor.html
25###############################
26
27# <第四引数以降(順不同、任意)>
28# lineType : 多角形の枠線の種類を指定する。cv2.LINE_4(4連結)、cv2.LINE_8(8連結)、cv2.LINE_AA(アンチエイリアス)のどれかを指定する。
29# デフォルト(lineTypeを指定しない場合)はcv2.LINE_8が設定される。
30# アンチエイリアスとは? : 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
31# cv2.LINE_4(4連結)、cv2.LINE_8(8連結)は、ブレゼンハムのアルゴリズムを用いて多角形の枠線を描画する。
32# ブレゼンハムのアルゴリズムとは? : 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
33
34# shift : 第二引数の座標位置をずらすために利用します。int型(0以上の整数)。デフォルト(shiftを指定しない場合)は0が設定される。
35# (x * 2^(-shift), y * 2^(-shift))の結果を、第二引数の値とする。
36# 例) 第二引数をnp.array([(100, 150), (50, 200), (30, 20)])、shiftへ1を指定すると、第二引数をnp.array([(50, 75), (25, 100), (15, 10)])に変更する。
37
38cv2.fillConvexPoly(img, np.array([(整数, 整数), (整数, 整数), ...]), (0~255の整数, 0~255の整数, 0~255の整数), lineType=(cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA)のどれか, shift=0以上の整数)
で定義されます。
例えば以下のようなコードを作成すると、
1import cv2
2import sys
3import numpy as np
4
5# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
6# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
7# 第一引数 : 画像のファイルパス
8# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
9img = cv2.imread('./xxx.xxx')
10
11# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
12if img is None:
13 sys.exit("Could not read the image.")
14
15# 第一引数(必須) : 多次元配列(numpy.ndarray)
16# 第二引数(必須) : 複数の座標。numpy.ndarray型。
17# 第三引数(必須) : 多角形の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
18cv2.fillConvexPoly(img, np.array([(210, 200), (220, 300), (300, 340), (340, 220)]), (255, 0, 0))
19
20# imwrite : 画像の保存を行う関数
21# 第一引数 : 保存先の画像ファイル名
22# 第二引数 : 多次元配列(numpy.ndarray)
23# <第二引数の例>
24# [
25# [
26# [234 237 228]
27# ...
28# [202 209 194]
29# ]
30# [
31# [10 27 16]
32# ...
33# [36 67 46]
34# ]
35# [
36# [34 51 40]
37# ...
38# [50 81 60]
39# ]
40# ]
41# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
42cv2.imwrite('output.jpg', img)
以下の画像のように、画像が描画されます。
imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。
imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。
画像内へ多角形を描画するその他の関数
画像内へ多角形を描画する、その他の関数として、
- fillPoly
があります。
fillPoly関数に関しては、OpenCVで使われるfillPolyとは?関数の利用法からサンプルコードを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。
まとめ
- OpenCVで使われるfillConvexPolyとは、複数の座標を結ぶことで、画像内へ多角形を描画する関数を意味する。
参考文献
- 多角形とは?
- fillConvexPoly関数 - 公式ドキュメント
- numpy.ndarray型とは?
- tuple型とは?
- アンチエイリアスとは?
- ブレゼンハムのアルゴリズムとは?
- OpenCVで使われるfillConvexPoly関数に関するサンプルコード