OpenCVで使われるellipseとは?活用法から定義まで徹底解説!?
今回はOpenCVで使われるellipseに関して、活用法から定義まで徹底解説致します。ellipse関数を利用したい、OpenCV初学者の方はおすすめです。ぜひ最後までご覧ください。
執筆者 - おすすめの記事3選
OpenCVで使われるellipseとは?
OpenCVで使われるellipseとは、画像内へ楕円 or 扇形 or 円弧を描画する関数です。
具体的なイメージとしては、以下の「ellipse関数のイメージ画像(楕円(扇形))」、「ellipse関数のイメージ画像(円弧)」の赤色で描画される箇所を、イメージしてもらうと良いでしょう。
【ellipse関数のイメージ画像(楕円(扇形))】
【ellipse関数のイメージ画像(円弧)】
OpenCVで使われるellipse関数の定義
ellipse関数は、
1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# ellipse関数 : 画像内へ楕円 or 扇形 or 円弧を描画する関数
5# ellipse関数 - 公式ドキュメント : https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html#ga28b2267d35786f5f890ca167236cbc69
6
7# 第一引数(必須) : 多次元配列(画像情報)
8
9###############################
10# 第二引数(必須) : 楕円 or 扇形 or 円弧の中心座標。tuple型。
11# tuple型とは? : https://atmarkit.itmedia.co.jp/ait/articles/1906/14/news015.html
12# 例) : (100, 150) ⏩ 楕円 or 扇形 or 円弧の中心座標をx座標100px, y座標150pxとする。
13# ※ 第二引数を指定する際は、画像の左上角が(0, 0)であることに留意する。
14###############################
15
16###############################
17# 第三引数(必須) : 楕円 or 扇形 or 円弧の長径、短径を指定する。tuple型。
18# 楕円 or 扇形 or 円弧の長径、短径とは? : https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86#:~:text=%E6%A5%95%E5%86%86%E3%81%AE%E5%86%85%E9%83%A8%E3%81%AB2,%E9%95%B7%E3%81%95%E3%82%92%E9%95%B7%E5%BE%84%E3%81%A8%E3%81%84%E3%81%86%E3%80%82&text=%E3%81%BE%E3%81%9F%E3%80%81%E9%95%B7%E8%BB%B8%E3%81%AE%E5%9E%82%E7%9B%B4,%E3%81%95%E3%82%92%E7%9F%AD%E5%BE%84%E3%81%A8%E3%81%84%E3%81%86%E3%80%82
19# ※ 第三引数を設定する際は、上の画像もしくは以下リンクの画像を確認しながら、指定することをおすすめします。
20# https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html#ga28b2267d35786f5f890ca167236cbc69
21# (0, 0)を指定すると、楕円 or 扇形 or 円弧が描画されない。
22# (0, n(正の整数)), (n(正の整数), 0)を指定すると、直線が描画される。
23# 例) : (60, 40) ⏩ 楕円 or 扇形 or 円弧の長径、短径を60px, 40pxとする。
24###############################
25
26###############################
27# 第四引数(必須)
28# 楕円 or 扇形 or 円弧の回転角度を指定する。float型。
29# 回転角度とは? : https://dictionary.goo.ne.jp/word/%E5%9B%9E%E8%BB%A2%E8%A7%92/
30# ※ 第四引数を設定する際は、上の画像もしくは以下リンクの画像を確認しながら、指定することをおすすめします。
31# https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html#ga28b2267d35786f5f890ca167236cbc69
32# 例) : 35.2 ⏩ 楕円 or 円弧 or 扇形の回転角度を35.2度とする。
33###############################
34
35###############################
36# 第五引数(必須)
37# 楕円 or 扇形 or 円弧の開始角度を指定する。float型。
38# ※ 第五引数を設定する際は、上の画像もしくは以下リンクの画像を確認しながら、指定することをおすすめします。
39# https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html#ga28b2267d35786f5f890ca167236cbc69
40# ※ 第五引数の値が第六引数より大きい場合、第六引数の値が第五引数に、第五引数の値が第六引数に交換されます。
41# 例) : 16.7 ⏩ 楕円 or 扇形 or 円弧の開始角度を16.7度とする。
42###############################
43
44###############################
45# 第六引数(必須)
46# 楕円 or 扇形 or 円弧の終了角度を指定する。float型。
47# ※ 第六引数を設定する際は、上の画像もしくは以下リンクの画像を確認しながら、指定することをおすすめします。
48# https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html#ga28b2267d35786f5f890ca167236cbc69
49# ※ 第五引数の値が第六引数より大きい場合、第六引数の値が第五引数に、第五引数の値が第六引数に交換されます。
50# 例) : 13.4 ⏩ 楕円 or 扇形 or 円弧の終了角度を13.4度とする。
51###############################
52
53###############################
54# 第七引数(必須) : 楕円 or 扇形 or 円弧の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
55# 例) : (255, 0, 0) ⏩ 楕円 or 扇形 or 円弧の色を青色にする。
56# 以下のサイトを利用して、楕円 or 扇形 or 円弧の色を考えると良いでしょう。
57# https://www.peko-step.com/tool/tfcolor.html
58###############################
59
60# <第八引数以降(順不同、任意)>
61# thickness : 楕円 or 扇形 or 円弧の太さ(px)を指定する。int型。デフォルト(thicknessを指定しない場合)は1が設定される。
62# 0を指定する場合、デフォルト(thicknessを指定しない場合)と同じ(1)になる。
63# 負の整数(-1, -3など)を与えると、円弧に囲まれる楕円 or 扇形の、中の塗りつぶしを行います。
64# 塗りつぶしとは? : 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
65# 例) thickness=4 ⏩ 楕円 or 円弧の太さを4pxとする。
66
67# lineType : 楕円 or 円弧の種類を指定する。cv2.LINE_4(4連結)、cv2.LINE_8(8連結)、cv2.LINE_AA(アンチエイリアス)のどれかを指定する。
68# デフォルト(lineTypeを指定しない場合)はcv2.LINE_8が設定される。
69# アンチエイリアスとは? : 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
70# cv2.LINE_4(4連結)、cv2.LINE_8(8連結)は、ブレゼンハムのアルゴリズムを用いて楕円 or 円弧を描画する。
71# ブレゼンハムのアルゴリズムとは? : 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
72# また太い楕円 or 円弧の(thicknessの値が大きい)の端は丸く描画されます。
73
74# shift : 第二引数、第三引数の値をずらすために利用します。int型(0以上の整数)。デフォルト(shiftを指定しない場合)は0が設定される。
75# (x * 2^(-shift), y * 2^(-shift))の結果を、第二引数、第三引数の値とする。
76# 例) 第二引数を(50, 100)、shiftへ1を指定すると、第二引数を(25, 50)に変更される。
77
78cv2.ellipse(img, (整数, 整数), (0以上の整数, 0以上の整数), 数字, 数字, 数字, (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# ellipse関数 : 画像内へ楕円 or 扇形 or 円弧を描画する関数
15
16# 第一引数(必須) : 多次元配列(numpy.ndarray)
17# 第二引数(必須) : 楕円 or 扇形 or 円弧の中心座標。tuple型。
18# 第三引数(必須) : 楕円 or 扇形 or 円弧の長径、短径を指定する。tuple型。
19# 第四引数(必須) : 楕円 or 扇形 or 円弧の回転角度を指定する。float型。
20# 第五引数(必須) : 楕円 or 扇形 or 円弧の開始角度を指定する。float型。
21# 第六引数(必須) : 楕円 or 扇形 or 円弧の終了角度を指定する。float型。
22# 第七引数(必須) : 楕円 or 扇形 or 円弧の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
23# thickness : 楕円 or 扇形 or 円弧の太さ(px)を指定する。int型。デフォルト(thicknessを指定しない場合)は1が設定される。
24# 負の整数(-1, -3など)を与えると、円弧に囲まれる楕円 or 扇形の、中の塗りつぶしを行います。
25cv2.ellipse(img, (400, 150), (60, 40), 0, 300, 360, (255, 0, 0), thickness=-1)
26
27# imwrite : 画像の保存を行う関数
28# 第一引数 : 保存先の画像ファイル名
29# 第二引数 : 多次元配列(numpy.ndarray)
30# <第二引数の例>
31# [
32# [
33# [234 237 228]
34# ...
35# [202 209 194]
36# ]
37# [
38# [10 27 16]
39# ...
40# [36 67 46]
41# ]
42# [
43# [34 51 40]
44# ...
45# [50 81 60]
46# ]
47# ]
48# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
49cv2.imwrite('output.jpg', img)
以下の画像のように、画像が描画されます。
【画像内へ扇形を描画する画像】
imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。
imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。
またcv2.ellipse(img, (400, 150), (60, 40), 0, 300, 360, (255, 0, 0), thickness=-1)
箇所を以下のコードへ変更すると、
1- cv2.ellipse(img, (400, 150), (60, 40), 0, 300, 360, (255, 0, 0), thickness=-1)
2+ cv2.ellipse(img, (400, 150), (60, 40), 0, 0, 360, (255, 0, 0), thickness=10)
以下の画像のように、画像が描画されます。
【画像内へ楕円を描画する画像】
またcv2.ellipse(img, (400, 150), (60, 40), 0, 300, 360, (255, 0, 0), thickness=-1)
箇所を以下のコードへ変更すると、
1- cv2.ellipse(img, (400, 150), (60, 40), 0, 300, 360, (255, 0, 0), thickness=-1)
2+ cv2.ellipse(img, (400, 150), (60, 40), 0, 300, 360, (255, 0, 0), thickness=10)
以下の画像のように、画像が描画されます。
【画像内へ円弧を描画する画像】
円弧の色と塗りつぶし色(楕円 or 扇形)を変えたい場合
円弧の色と塗りつぶし色(楕円 or 扇形)を変えたい場合は、先に塗りつぶし処理を行って、次に同じ位置で円弧を描画すると上手くいきます。一度に複数指定(塗りつぶしと円弧の描画)することは出来ません。
例えば以下のようなコードを作成すると、
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# ellipse関数 : 画像内へ楕円 or 扇形 or 円弧を描画する関数
15
16# 第一引数(必須) : 多次元配列(numpy.ndarray)
17# 第二引数(必須) : 楕円 or 扇形 or 円弧の中心座標。tuple型。
18# 第三引数(必須) : 楕円 or 扇形 or 円弧の長径、短径を指定する。tuple型。
19# 第四引数(必須) : 楕円 or 扇形 or 円弧の回転角度を指定する。float型。
20# 第五引数(必須) : 楕円 or 扇形 or 円弧の開始角度を指定する。float型。
21# 第六引数(必須) : 楕円 or 扇形 or 円弧の終了角度を指定する。float型。
22# 第七引数(必須) : 楕円 or 扇形 or 円弧の色を指定する。B(Blue)G(Green)R(Red)形式で指定する。tuple型。
23# thickness : 楕円 or 扇形 or 円弧の太さ(px)を指定する。int型。デフォルト(thicknessを指定しない場合)は1が設定される。
24# 負の整数(-1, -3など)を与えると、円弧に囲まれる楕円 or 扇形の、中の塗りつぶしを行います。
25cv2.ellipse(img, (400, 150), (60, 40), 0, 0, 360, (255, 0, 0), thickness=-1)
26cv2.ellipse(img, (400, 150), (60, 40), 0, 0, 360, (0, 0, 255), thickness=10)
27
28# imwrite : 画像の保存を行う関数
29# 第一引数 : 保存先の画像ファイル名
30# 第二引数 : 多次元配列(numpy.ndarray)
31# <第二引数の例>
32# [
33# [
34# [234 237 228]
35# ...
36# [202 209 194]
37# ]
38# [
39# [10 27 16]
40# ...
41# [36 67 46]
42# ]
43# [
44# [34 51 40]
45# ...
46# [50 81 60]
47# ]
48# ]
49# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
50cv2.imwrite('output.jpg', img)
以下の画像のように、画像が描画されます。
【円弧の色と塗りつぶし色(楕円 or 扇形)を変えたい場合画像】
まとめ
- OpenCVで使われるellipseとは、画像内へ楕円 or 扇形 or 円弧を描画する関数です。
- 円弧の色と塗りつぶし色(楕円 or 扇形)を変えたい場合は、先に塗りつぶし処理を行って、次に同じ位置で円弧を描画すると上手くいきます。
参考文献
- 楕円とは?
- 扇形、円弧とは?
- ellipse関数 - 公式ドキュメント
- tuple型とは?
- 楕円 or 扇形 or 円弧の長径、短径とは?
- 回転角度とは?
- 塗りつぶしとは?
- アンチエイリアスとは?
- ブレゼンハムのアルゴリズムとは?
- OpenCVで使われるellipse関数に関するサンプルコード