はじめに
画像の上に直線を描画方法について解説します。
直線を描画
2 点を結ぶ直線を描画するためにはcv2.line
関数を使用します。
cv2.line関数
線分は画像の境界でクリップされます。
整数座標を持つ非アンチエイリアス ラインの場合、8 連結または 4 連結 Bresenham アルゴリズムが使用されます。太い線は、丸みのある端で描かれます。アンチエイリアス処理された線は、ガウス フィルタリングを使用して描画されます。
引数
名称 | 説明 |
入力画像(必須) | 入力画像データ |
pt1(必須) | 線の始点の座標 |
pt2(必須) | 線の終点の座標 |
color(必須) | 線の色 |
thickness(オプション) | 線の太さ(1以上、デフォルト:"1") |
lineType(オプション) | 線の種類(デフォルト:cv.2LINE_8) |
shift(オプション) | 座標の小数ビット数(デフォルト:"0") |
使い方
引数のlineTypeはLineTypesに示す4種類のいずれかとなります。デフォルトはcv2.LINE_8
です。
LineTypesにはcv2.FILLED
(塗りつぶし)という値も存在しますが、cv2.line
関数では使用することができません。Pythonでは実行時にエラーとなります。
LineTypes(線の種類)
線の種類を比較した結果が下の画像です。
上から順番にcv2.LINE_4
、 cv2.LINE_8
、 cv2.LINE_AA
を指定して描画しています。cv2.LINE_4
が一番ギザギザした印象で、cv2.LINE_AA
はアンチエイリアス処理されとても綺麗な線となっています。
線の種類 | 説明 |
cv2.FILLED | cv2.line 関数では使用不可 |
cv2.LINE_4 | 4 連結 |
cv.2LINE_8 | 8 連結(デフォルト) |
cv2.LINE_AA | アンチエイリアス処理された線 |
この画像を作成したソースコードを示します。
import cv2 import numpy as np # Create black empty images size = 95, 150, 3 # cv.lineに設定するパラメータ line_color = (255, 0, 255) # マゼンタ thickness = 1 # 白で塗りつぶした画像を作成 image = np.full(size, 255, dtype=np.uint8) # 2本目の線 cv2.LINE_4で描画 pt1 = 20, 20 pt2 = 130, 35 line_type = cv2.LINE_4 cv2.line(image, pt1, pt2, line_color, thickness, line_type) # 3本目の線 cv2.LINE_8で描画 pt1 = 20, 40 pt2 = 130, 55 line_type = cv2.LINE_8 cv2.line(image, pt1, pt2, line_color, thickness, line_type) # 4本目の線 cv2.LINE_AAで描画 pt1 = 20, 60 pt2 = 130, 75 line_type = cv2.LINE_AA cv2.line(image, pt1, pt2, line_color, thickness, line_type)
shift(座標の少数ビット数)
shiftは座標を小数点以下で指定する場合の小数点以下の桁数を示すビット数です。デフォルトは”0”となっており、整数の座標のみを扱う状態になっています。より正確な描画が必要な時に使用しますが、通常の使用ではデフォルトの”0”でよいでしょう。
最後までご覧いただきありがとうございました。
■(広告)OpenCVの参考書としてどうぞ!■
参考リンク
OpenCV: Drawing Functions
OpenCV: Basic Drawing