2020年6月8日月曜日

【OpenCV】楕円を描画するellipse

 画像処理ライブラリOpenCVで楕円を描画するellipseについて説明する。

OpenCVを使うには次のようにインポートが必要。
import cv2


1. 中心座標と軸長さを指定する書き方

ellipseの書式には、中心座標と軸長さを指定する方法と外接長方形を指定する方法がある。中心座標と軸長さを指定する場合の書式は以下の通り。

cv2.ellipse(img, center, axes, angle, 
      startAngle, endAngle, color[, thickness[, lineType[, shift]]])

引数 意味
img 円を描画する画像
center 楕円の中心座標。(x, y)のタプルで指定
axes 楕円の半径。(横方向の半径、縦方向の半径)のタプルで指定
angle 偏角。時計方向に楕円を回転させる角度
startAngle, endAngle 描画開始角度と終了角度。xの正方向(右)を0°として時計回り
color 円の色。(b, g, r)で指定。
thickness(省略可) 円の枠線の幅。-1の場合は塗りつぶしになる
lineType(省略可) cv2.FILLED
cv2.LINE_8(8連結、デフォルト)
cv2.LINE_4(4連結)
cv2.LINE_AA(アンチエイリアス処理)
shift(省略可) 座標および半径を小数表示する場合に使用。指定した場合
(x, y), r が
(x/2^shift, y/2^shift), r/2^shift となる。

lineTypeshiftの指定方法については以下記事を参照。
【OpenCV】円を描画するcircle()関数



幅400高さ300の白画像を作成し、中心座標x=200,y=150の位置に、横方向半径が100、縦方向の半径が50、線幅3の赤い楕円を描画する例。偏角、始角、終角はそれぞれ0,0,360°。

import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)
img[:, :, :] = 255

cv2.ellipse(img, (200, 150), (100, 50), 0,0,360,(0,0,255), 3)

cv2.imwrite('ellipse.png', img)

実行結果



2. 外接長方形を指定する書き方

外接長方形を指定する場合の書式は以下の通り。

cv2.ellipse(img, box, color[, thickness[, lineType]])
引数 意味
img 円を描画する画像
box 中心座標(x, y)、外接長方形の横幅,高さ、つまり楕円の(横方向の直径、縦方向の直径)、回転角度
color 円の色。(b, g, r)で指定。
thickness(省略可) 円の枠線の幅。-1の場合は塗りつぶしになる
lineType(省略可) cv2.FILLED
cv2.LINE_8(8連結、デフォルト)
cv2.LINE_4(4連結)
cv2.LINE_AA(アンチエイリアス処理)

幅400高さ300の白画像を作成し、中心座標x=200,y=150の位置に、横方向半径が100、縦方向の半径が50、時計方向に30°回転した青い塗りつぶし楕円を描画する例。

import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)
img[:, :, :] = 255

cv2.ellipse(img, ((200, 150), (200, 100), 30), (255, 0, 0), -1)

cv2.imwrite('ellipse.png', img)

実行結果



3. 偏角、始角、終角の指定

引数angleにより偏角(回転角)を指定できる。x軸y軸方向を楕円の軸が向いている状態を基準として時計回りに何°回転させるかを指定。また始角(startAngle)および終角(endAngle)を指定すると始角~終角の範囲で楕円が描画される。

横幅100高さ50の赤い楕円を偏角0,30,60,90°で描画する例。

import cv2
import numpy as np

img = np.zeros((600, 400, 3), np.uint8)
img[:, :, :] = 255

for i in range(4):
    y = i*150 + 50
    angle = i * 30
    cv2.ellipse(img, (200, y), (100, 50), angle, 0, 360, (0, 0, 255), 3)

cv2.imwrite('angle.png', img)

実行結果



横幅100高さ50の赤い楕円を始角0,60,120,180°で描画する例。偏角は0°終角は360°で固定。

import cv2
import numpy as np

img = np.zeros((600, 400, 3), np.uint8)
img[:, :, :] = 255

for i in range(4):
    y = i*150 + 50
    startangle = i * 60
    cv2.ellipse(img, (200, y), (100, 50), 0, startangle, 360, (0, 0, 255), 3)

cv2.imwrite('startangle.png', img)

実行結果



thicknessを-1とすると扇型、蓮の葉型の塗りつぶした楕円が描画できる。

import cv2
import numpy as np

img = np.zeros((600, 400, 3), np.uint8)
img[:, :, :] = 255

for i in range(4):
    y = i*150 + 50
    startangle = i * 60
    cv2.ellipse(img, (200, y), (100, 50), 0, startangle, 360, (0, 0, 255), -1)

cv2.imwrite('startangle.png', img)

実行結果



横幅100高さ50の赤い楕円を終角0,60,120,180°で描画する例。偏角は0°始角は0°で固定。

import cv2
import numpy as np

img = np.zeros((600, 400, 3), np.uint8)
img[:, :, :] = 255

for i in range(4):
    y = i*150 + 50
    endangle = i * 60
    cv2.ellipse(img, (200, y), (100, 50), 0, 0 ,endangle, (0, 0, 255), 3)

cv2.imwrite('endangle.png', img)

実行結果



始角・終角の基準角度は偏角0°の場合はx軸の正方向(右方向)だが、偏角が0°でない場合は偏角分ずれる。
始角30°終角270°で偏角を0,30,60,90°と変化させた場合

import cv2
import numpy as np

img = np.zeros((600, 400, 3), np.uint8)
img[:, :, :] = 255

for i in range(4):
    y = i*150 + 50
    angle = i * 30
    cv2.ellipse(img, (200, y), (100, 50), angle, 30 ,270, (0, 0, 255), 3)

cv2.imwrite('angles.png', img)

実行結果



4. リファレンス

OpenCV > Drawing Functions > ellipse()

使用したバージョン:Python 3.7.0 / OpenCV 4.0.0

0 件のコメント:

コメントを投稿