OpenCVで使われるlineとは?lineの各引数の意味や使用法を徹底解説!?
今回はOpenCVで使われるlineに関して、lineの各引数の意味や使用法を徹底解説致します。なんとなくlineを使っていた、OpenCVを使い始めた方へおすすめです。ぜひ最後までご覧ください。
執筆者 - おすすめの記事3選
OpenCVで使われるlineとは?
OpenCVで使われるlineとは、画像内へ線分を描画する関数です。
具体的なイメージとしては、以下の「line関数のイメージ画像」の赤色で描画される箇所(線分)を、イメージしてもらうと良いでしょう。
【line関数のイメージ画像】
OpenCVで使われるline関数の定義
line関数は、
1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# line関数 : 画像内へ線分を描画する関数
5# line関数 - 公式ドキュメント : https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html#ga7078a9fae8c7e7d13d24dac2520ae4a2
6# 第一引数(必須) : 多次元配列(画像情報)
7
8###############################
9# 第二引数(必須) : 線分の始点の座標。tuple型。
10# 始点とは? : https://dictionary.goo.ne.jp/word/%E5%A7%8B%E7%82%B9/
11# tuple型とは? : https://atmarkit.itmedia.co.jp/ait/articles/1906/14/news015.html
12# 例) : (100, 150) ⏩ 線分の始点をx座標100px, y座標150pxとする。
13# ※ 第二引数を指定する際は、画像の左上角が(0, 0)であることに留意する。
14###############################
15
16###############################
17# 第三引数(必須) : 線分の終点の座標。tuple型。
18# 終点とは? : https://dictionary.goo.ne.jp/word/%E7%B5%82%E7%82%B9/
19# tuple型とは? : https://atmarkit.itmedia.co.jp/ait/articles/1906/14/news015.html
20# 例) : (70, 80) ⏩ 線分の終点をx座標70px, y座標80pxとする。
21# ※ 第三引数を指定する際は、画像の左上角が(0, 0)であることに留意する。
22###############################
23
24###############################
25# 第四引数(必須) : 線分の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
26# 例) : (255, 0, 0) ⏩ 線分の色を青色にする。
27# 以下のサイトを利用して、線分の色を考えると良いでしょう。
28# https://www.peko-step.com/tool/tfcolor.html
29###############################
30
31# <第五引数以降(順不同、任意)>
32# thickness : 線分の太さ(px)を指定する。int型(1以上の整数)。デフォルト(thicknessを指定しない場合)は1が設定される。
33# 例) thickness=4 ⏩ 線分の太さを4pxとする。
34
35# lineType : 線分の種類を指定する。cv2.LINE_4(4連結)、cv2.LINE_8(8連結)、cv2.LINE_AA(アンチエイリアス)のどれかを指定する。
36# デフォルト(lineTypeを指定しない場合)はcv2.LINE_8が設定される。
37# アンチエイリアスとは? : 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
38# 画素とは? : https://ptl.imagegateway.net/contents/original/glossary/%E7%94%BB%E7%B4%A0.html#:~:text=%E7%94%BB%E7%B4%A0%E3%81%A8%E3%81%AF%E3%80%81%E7%94%BB%E5%83%8F%E3%81%AE,%E8%A6%8F%E5%89%87%E6%AD%A3%E3%81%97%E3%81%8F%E4%B8%A6%E3%82%93%E3%81%A7%E3%81%84%E3%81%BE%E3%81%99%E3%80%82
39# アンチエイリアスの簡単な説明 : 画像は画素(点)の集まりでできている。 ⏩ 斜めの線分を描画する場合、どうしても画素(点)を、階段状に並べて描画することになる。 ⏩ 線分の見た目がギザギザになる。 ⏩ 線分らしくするために、見た目のギザギザを補正する。 = アンチエイリアス
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.line(img, (整数, 整数), (整数, 整数), (0~255の整数, 0~255の整数, 0~255の整数), thickness=1以上の整数, 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# line関数 : 画像内へ線分を描画する関数
15# 第一引数(必須) : 多次元配列(numpy.ndarray)
16# 第二引数(必須) : 線分の始点の座標。tuple型。
17# 第三引数(必須) : 線分の終点の座標。tuple型。
18# 第四引数(必須) : 線分の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
19# thickness : 線分の太さ(px)を指定する。int型(1以上の整数)。デフォルト(thicknessを指定しない場合)は1が設定される。
20cv2.line(img, (200, 200), (150, 100), (255, 0, 0), thickness=4)
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の定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。
まとめ
- OpenCVで使われるlineとは、画像内へ線分を描画する関数を意味する。
- 線分の始点・終点の値を指定する際は、画像の左上角が(0, 0)であることに留意する。
参考文献
- 線分とは?
- line関数 - 公式ドキュメント
- 始点とは?
- 終点とは?
- tuple型とは?
- アンチエイリアスとは?
- 画素とは?
- ブレゼンハムのアルゴリズムとは?
- OpenCVで使われるline関数に関するサンプルコード