KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
OpenCVで使われるfillPolyとは?関数の利用法からサンプルコードを解説

OpenCVで使われるfillPolyとは?関数の利用法からサンプルコードを解説

今回はOpenCVで使われるfillPolyに関して、関数の利用法からサンプルコードを徹底解説致します。fillPoly関数を学びたい、OpenCV初学者の方はおすすめです。ぜひ最後までご覧ください。

目次
  1. OpenCVで使われるfillPolyとは?
  2. OpenCVで使われるfillPoly関数の定義
    1. 1度のfillPoly関数呼び出しで、複数の多角形を描画したい場合
    2. 画像内へ多角形を描画するその他の関数
  3. まとめ
  4. 参考文献

執筆者 - おすすめの記事3選

OpenCVで使われるfillPolyとは?

OpenCVで使われるfillPolyとは、複数の座標を結ぶことで、画像内へ多角形を描画する関数です。

具体的なイメージとしては、以下の「fillPoly関数のイメージ画像」の赤色で描画される箇所を、イメージしてもらうと良いでしょう。

【fillPoly関数のイメージ画像】

OpenCVで使われるfillPoly関数の定義

fillPoly関数は、

1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3# numpyを利用する宣言を行う。
4import numpy as np
5
6# fillPoly関数 : 複数の座標を結ぶことで、画像内へ多角形を描画する関数。
7# fillPoly関数 - 公式ドキュメント : https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html#ga311160e71d37e3b795324d097cb3a7dc
8
9# 第一引数(必須) : 多次元配列(画像情報)
10
11###############################
12# 第二引数(必須) : 複数の座標。numpy.ndarray型。
13# numpy.ndarray型とは? : https://note.nkmk.me/python-list-array-numpy-ndarray/
14# 例) : [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)を結ぶ。
15# ※ 第二引数を指定する際は、画像の左上角が(0, 0)であることに留意する。
16############################### 
17
18###############################
19# 第三引数(必須) : 多角形の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
20# tuple型とは? : https://atmarkit.itmedia.co.jp/ait/articles/1906/14/news015.html
21# 例) : (255, 0, 0) ⏩ 多角形の色を青色にする。
22# 以下のサイトを利用して、多角形の色を考えると良いでしょう。
23# https://www.peko-step.com/tool/tfcolor.html
24###############################
25
26# <第四引数以降(順不同、任意)>
27# lineType : 多角形の枠線の種類を指定する。cv2.LINE_4(4連結)、cv2.LINE_8(8連結)、cv2.LINE_AA(アンチエイリアス)のどれかを指定する。
28# デフォルト(lineTypeを指定しない場合)はcv2.LINE_8が設定される。
29# アンチエイリアスとは? : 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
30# cv2.LINE_4(4連結)、cv2.LINE_8(8連結)は、ブレゼンハムのアルゴリズムを用いて多角形の枠線を描画する。
31# ブレゼンハムのアルゴリズムとは? : 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
32
33# shift : 第二引数の座標位置をずらすために利用します。int型(0以上の整数)。デフォルト(shiftを指定しない場合)は0が設定される。
34# (x * 2^(-shift), y * 2^(-shift))の結果を、第二引数の値とする。
35# 例) 第二引数を[np.array([(100, 150), (50, 200), (30, 20)])]、shiftへ1を指定すると、第二引数を[np.array([(50, 75), (25, 100), (15, 10)])]に変更する。
36
37# offset : 第二引数で指定した座標を平行移動するために、利用します。tuple型。デフォルト(offsetを指定しない場合)は(0, 0)が設定される。
38# 平行移動とは? : https://manapedia.jp/text/2505
39# 例) : 第二引数を[np.array([(100, 150), (50, 200), (30, 20)])]、offsetへ(10, 20)を指定すると、第二引数を[np.array([(110, 170), (60, 220), (40, 40)])]に変更する。
40
41cv2.fillPoly(img, [np.array([(整数, 整数), (整数, 整数), ...])], (0~255の整数, 0~255の整数, 0~255の整数), lineType=(cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA)のどれか, shift=0以上の整数, offset=(整数, 整数))

で定義されます。

例えば以下のようなコードを作成すると、

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# 第一引数(必須) : 多次元配列(画像情報)
16# 第二引数(必須) : 複数の座標。numpy.ndarray型。
17# 第三引数(必須) : 多角形の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
18cv2.fillPoly(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の定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。

1度のfillPoly関数呼び出しで、複数の多角形を描画したい場合

1度のfillPoly関数呼び出しで、複数の多角形を描画したい場合は、fillPoly関数の第二引数を[np.array([(整数, 整数), (整数, 整数), ...]), np.array([(整数, 整数), (整数, 整数), ...]), ...]へと変更するとうまくいきます。

例えば以下のようなコードを作成すると、

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# 第一引数(必須) : 多次元配列(画像情報)
16# 第二引数(必須) : 複数の座標。numpy.ndarray型。
17# 第三引数(必須) : 多角形の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
18cv2.fillPoly(img, [np.array([(300, 200), (220, 300), (300, 340), (340, 220)]), np.array([(200, 100), (210, 200), (250, 240), (330, 120)])], (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)

以下の画像のように、画像が描画されます。

画像内へ多角形を描画するその他の関数

画像内へ多角形を描画する、その他の関数として、

  • fillConvexPoly

があります。

fillConvexPoly関数に関しては、OpenCVで使われるfillConvexPolyとは?関数の定義・利用法を解説でまとめていますので、詳しく知りたい方は是非ご確認ください。

まとめ

  • OpenCVで使われるfillPolyとは、複数の座標を結ぶことで、画像内へ多角形を描画する関数を意味する。

参考文献

記事に関するお問い合わせ