2020年6月8日月曜日

【OpenCV】直線を描画するline

 画像処理ライブラリOpenCVで直線を描画するlineについて説明する。

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

import cv2


1. 直線を描画するline

 2点を結ぶ直線を描画するlineの書式は以下の通り。

cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

引数 意味
img 円を描画する画像
pt1 1つ目の点の座標。(x, y)のタプルで指定
pt2 2つ目の点の座標。(x, y)のタプルで指定
color 線の色。(b, g, r)で指定。
thickness(省略可) 線の枠線の幅(整数)。
lineType(省略可) cv2.FILLED
cv2.LINE_8(8連結、デフォルト)
cv2.LINE_4(4連結)
cv2.LINE_AA(アンチエイリアス処理)
shift(省略可) 点の座標を小数表示する場合に使用。指定した場合
(x, y)が
(x/2^shift, y/2^shift)となる。


幅400高さ300の白画像を作成し、x=100,y=100およびx=300,y=200の2点を結ぶ太さ5の青い線を描画する例。

import cv2
import numpy as np

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

cv2.line(img, (100, 100), (300, 200), (255, 0, 0), 5)

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

実行結果



2. 引数lineTypeを指定した場合

lineTypeを指定すると線の種類を選択できる。
cv2.FILLED
cv2.LINE_8(8連結、デフォルト)
cv2.LINE_4(4連結)
cv2.LINE_AA(アンチエイリアス処理)
以下のような違いがある。

import cv2
import numpy as np

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

cv2.line(img, (60, 20), (10, 80), (255, 0, 0), 2, lineType=cv2.FILLED)
cv2.line(img, (70, 20), (20, 80), (255, 0, 0), 2, lineType=cv2.LINE_4)
cv2.line(img, (80, 20), (30, 80), (255, 0, 0), 2, lineType=cv2.LINE_8)
cv2.line(img, (90, 20), (40, 80), (255, 0, 0), 2, lineType=cv2.LINE_AA)

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

左からcv2.FILLEDcv2.LINE_4cv2.LINE_8cv2.LINE_AA
cv2.LINE_AAは中間色を使ったアンチエイリアス処理が施されギザギザが低減される。

実行結果



3. 引数shiftを指定した場合

shiftを指定すると座標が2^shiftで割られた値となる。つまりshift=1の場合1/2、shift=2の場合1/4、shift=3の場合1/8・・・となる。
座標には整数しか与えられないが、shiftにより小数に変換できる。

import cv2
import numpy as np

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

cv2.line(img, (300, 100), (200, 200), (255, 0, 0), 5)
cv2.line(img, (300, 100), (200, 200), (255, 0, 0), 5, shift = 1)
cv2.line(img, (300, 100), (200, 200), (255, 0, 0), 5, shift = 2)
cv2.line(img, (300, 100), (200, 200), (255, 0, 0), 5, shift = 3)

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

左からshift=3、shift=2、shift=1、shiftなし。

実行結果



4. リファレンス

OpenCV > Drawing Functions > line()

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

0 件のコメント:

コメントを投稿