OpenCVで使われるpolylinesとは?画像内へ折れ線を描画する方法を解説
今回はOpenCVで使われるpolylinesを用いて、画像内へ折れ線を描画する方法を解説致します。コードを通してpolylines関数を学びたい、OpenCV初学者の方はおすすめです。ぜひ最後までご覧ください。
執筆者 - おすすめの記事3選
OpenCVで使われるpolylinesとは?
OpenCVで使われるpolylinesとは、複数の座標を結ぶことで、画像内へ折れ線を描画する関数です。
具体的なイメージとしては、以下の「polylines関数のイメージ画像」の赤色で描画される箇所を、イメージしてもらうと良いでしょう。
【polylines関数のイメージ画像】
OpenCVで使われるpolylines関数の定義
polylines関数は、
1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3# numpyを利用する宣言を行う。
4import numpy as np
5
6# polylines関数 : 複数の座標を結ぶことで、画像内へ折れ線を描画する関数。
7# polylines関数 - 公式ドキュメント : https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html#gaa3c25f9fb764b6bef791bf034f6e26f5
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)を結ぶ。
15# ※ 第二引数を指定する際は、画像の左上角が(0, 0)であることに留意する。
16###############################
17
18# 第三引数(必須) : 複数の座標(第二引数)の始点と終点を結ぶのか指定する。
19# 始点とは? : https://www.weblio.jp/content/%E5%A7%8B%E7%82%B9#:~:text=%E3%81%97%E2%80%90%E3%81%A6%E3%82%93%E3%80%90%E5%A7%8B%E7%82%B9%E3%80%91,%E2%87%94%E7%B5%82%E7%82%B9%E3%80%82
20# 終点とは? : https://dictionary.goo.ne.jp/word/%E7%B5%82%E7%82%B9/
21# True(始点と終点を結ぶ) or False(始点と終点を結ばない)で設定します。
22# 第二引数の値が、[np.array([(100, 150), (50, 200), (30, 20)])]の場合、(100, 150)と(30, 20)を結ぶのか設定すると考えると良いでしょう。
23# 例) : True ⏩ 複数の座標(第二引数)の始点と終点を結ぶ。
24
25###############################
26# 第四引数(必須) : 折れ線の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
27# 例) : (255, 0, 0) ⏩ 折れ線の色を青色にする。
28# 以下のサイトを利用して、折れ線の色を考えると良いでしょう。
29# https://www.peko-step.com/tool/tfcolor.html
30###############################
31
32# <第五引数以降(順不同、任意)>
33# thickness : 折れ線の太さ(px)を指定する。int型(0以上の整数)。デフォルト(thicknessを指定しない場合)は1が設定される。
34# 0を指定する場合、デフォルト(thicknessを指定しない場合)と同じ(1)になる。
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# 例) 第二引数を[np.array([(100, 150), (50, 200), (30, 20)])]、shiftへ1を指定すると、第二引数を[np.array([(50, 75), (25, 100), (15, 10)])]に変更される。
47
48cv2.polylines(img, [np.array([(整数, 整数), (整数, 整数), ...])], True or False, (0~255の整数, 0~255の整数, 0~255の整数), thickness=0以上の整数, 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# 第三引数(必須) : 複数の座標(第二引数)の始点と終点を結ぶのか指定する。
18# 第四引数(必須) : 折れ線の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
19# thickness : 折れ線の太さ(px)を指定する。
20cv2.polylines(img, [np.array([(200, 200), (210, 230), (300, 260), (350, 300)])], False, (255, 255, 0), thickness=3)
21
22# imwrite : 画像の保存を行う関数
23# 第一引数 : 保存先の画像ファイル名
24# 第二引数 : 多次元配列(numpy.ndarray)
25# <第二引数の例>
26# [
27# [
28# [234 237 228]
29# ...
30# [202 209 194]
31# ]
32# [
33# [10 27 16]
34# ...
35# [36 67 46]
36# ]
37# [
38# [34 51 40]
39# ...
40# [50 81 60]
41# ]
42# ]
43# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
44cv2.imwrite('output.jpg', img)
以下の画像のように、画像が描画されます。
imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。
imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。
1度のpolylines関数呼び出しで、複数の折れ線を描画したい場合
1度のpolylines関数呼び出しで、複数の折れ線を描画したい場合は、polylines関数の第二引数を[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# 第一引数(必須) : 多次元配列(numpy.ndarray)
16# 第二引数(必須) : 複数の座標。numpy.ndarray型。
17# 第三引数(必須) : 複数の座標(第二引数)の始点と終点を結ぶのか指定する。
18# 第四引数(必須) : 折れ線の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
19# thickness : 折れ線の太さ(px)を指定する。
20cv2.polylines(img, [np.array([(200, 200), (210, 230), (300, 260), (350, 300)]), np.array([(150, 100), (160, 130), (250, 160), (300, 200)])], False, (255, 255, 0), thickness=5)
21
22# imwrite : 画像の保存を行う関数
23# 第一引数 : 保存先の画像ファイル名
24# 第二引数 : 多次元配列(numpy.ndarray)
25# <第二引数の例>
26# [
27# [
28# [234 237 228]
29# ...
30# [202 209 194]
31# ]
32# [
33# [10 27 16]
34# ...
35# [36 67 46]
36# ]
37# [
38# [34 51 40]
39# ...
40# [50 81 60]
41# ]
42# ]
43# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
44cv2.imwrite('output.jpg', img)
以下の画像のように、画像が描画されます。
まとめ
- OpenCVで使われるpolylinesとは、複数の座標を結ぶことで、画像内へ折れ線を描画する関数を意味する。
参考文献
- 折れ線とは?
- polylines関数 - 公式ドキュメント
- numpy.ndarray型とは?
- 始点とは?
- 終点とは?
- アンチエイリアスとは?
- ブレゼンハムのアルゴリズムとは?
- OpenCVで使われるpolylines関数に関するサンプルコード