log/20250422/佐藤綺羅

描画関数

line関数

 cv2.line(入力画像, pt1, pt2, color, thickness, lineType, shift)

線を描画するクラス関数。
引数は以下の通り。

入力画像(必須)入力画像データ
pt1(必須)線の始点の座標
pt2(必須)線の終点の座標
color(必須)線の色
thickness(任意)線の太さ(整数のみ、実数は不可、デフォルトは"1")
lineType(任意)線の種類(デフォルトはcv.2LINE_8)
shift(任意)座標の小数ビット数(デフォルトは"0")

以下にプログラムの実行例を示す。

 #!/usr/bin/python

import cv2

img = cv2.imread("neko.jpeg")

cv2.line(img, (0,0), (200,200), (0,0,255), 1, cv2.LINE_AA)

cv2.imshow("neko", img)
cv2.waitKey(0)

実行結果
neko_line.png
(0,0)から(200,200)にかけてR=255の線が引かれたのが分かる。
lineTypeにcv2.LINE_AAを入れるとアンチエイリアスされた画像が出力される。
線のギザギザが滑らかになるので、原則こちらを用いる。

rectangle関数

cv2.rectangle(入力画像, pt1, pt2, color, thickness, lineType, shift)

四角形を描画するクラス関数。
引数についてはline関数と同様。
以下の命令を先ほどのプログラムの7行目に差し替えると...

cv2.rectangle(img, (10,10), (100,150), (0,0,255), cv2.FILLED, cv2.LINE_AA)

実行結果
neko.rectangle.png
(10,10)を左上、(100,150)を右下とした長方形が描画される。
thicknessにcv2.FILLEDを入れると図形が塗りつぶされる。
"-1"を入れることでも可能。

circle関数

cv2.circle(入力画像, center, radius, color, thickness, lineType, shift)

円を描画するクラス関数。
引数は以下の通り。 既出のものは以後省略。

center(必須)円の中心の座標。(x座標, y座標)の並びのタプル。
radius(必須)円の半径

プログラム例

cv2.circle(img, (100,100), 40, (255,0,0), 2)

実行結果
neko_circle.png
(100,100)中心とした半径40、B=255、太さ2の円が描画される。
なお、太さは画素数を表しているわけではなく、かなり極端に変化する。
ここらへんの仕様はクソ(矢野先生談)なので、諦める他ない。
rectangle関数と同様に、太さを-1にすることで塗りつぶすことも可能。

drawMarker関数

cv2.drawMarker(img, coor, color, markerType, markerSize)

マーカーを描画するクラス関数。
引数は以下の通り。

coor(必須)中心の座標(x,y)
markerType(任意)マークのタイプ(デフォルトはcv2.MERKER_CROSS)
markerSize(任意)マークの大きさ(デフォルトは"20")

markerTypeには以下のようなものがある。

+cv2.MARKER_CROSS(デフォルト)
*cv2.MARKER_TILTED_CROSS
cv2.MARKER_STAR
cv2.MARKER_DIAMOND
cv2.MARKER_SQUARE
cv2.MARKER_TRIANGLE_UP
cv2.MARKER_TRIANGLE_DOWN

プログラム例

cv2.drawMarker(img, (100,100), (0,0,0), cv2.MARKER_STAR, 100)

実行結果
neko_drawMarker.png
(100,100)を中心としたR,G,B=0(黒)、サイズ100の星型マーカーが描画される。
こちらのサイズはきっちりと画素数に合わせたものになる。

putText関数

cv2.putText(入力画像, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)

テキストを描画するクラス関数。
日本語は出力不可。
引数は以下の通り。

text(必須)描画するテキスト
org(必須)テキストの左下の座標。(x座標, y座標)の並びのタプル
fontFace(必須)フォントの種類の指定
fontScale(必須)フォントサイズのスケール係数(float型)
bottomLeftOrigin(任意)座標系の原点がどこにあるかを指定(デフォルト:False、画像の左上が原点)

fontFaceには以下のようなものがある。

cv2.FONT_HERSHEY_SIMPLEX標準的なゴシック体フォント
cv2.FONT_HERSHEY_PLAIN小さいサイズのゴシック体フォント
cv2.FONT_HERSHEY_DUPLEX通常サイズのゴシック体フォント(cv2.FONT_HERSHEY_SIMPLEXより太い)
cv2.FONT_HERSHEY_COMPLEX通常サイズのスクリプト体フォント
cv2.FONT_HERSHEY_TRIPLEX通常サイズのスクリプト体フォント(cv2.FONT_HERSHEY_COMPLEXより太い)
cv2.FONT_HERSHEY_COMPLEX_SMALL小さいサイズのスクリプト体フォント
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX手書き風フォント
cv2.FONT_HERSHEY_SCRIPT_COMPLEX手書き風フォント(cv2.FONT_HERSHEY_SCRIPT_SIMPLEX より太く、デザインが異なる)

プログラム例

cv2.putText(img,
            "ABCxyz", (20, 50), cv2.FONT_HERSHEY_COMPLEX_SMALL,
            2.0, (0, 0, 0), 1, cv2.LINE_AA)

実行結果
neko_putText.png
(20, 50)を原点とした、R,G,B=0(黒)の"ABCxyz"の文字列が描画される。
なお(20, 50)は文字列の左下(Aの足の部分)である。

補足:lineTypeについて

linetypeには以下の4つが存在する。

cv2.LINE_44連結
cv2.LINE_88連結(デフォルト)
cv2.LINE_AAアンチエイリアス処理された線
cv2.FILLED塗りつぶし(line, putText関数では使用不可)

line関数を用いてそれぞれのlineTypeを比較すると以下のようになる。
comparison_line.jpg
上から、cv2.LINE_4、cv2.LINE_8、cv2.LINE_AAである。
他のものと比較して、cv2.LINE_AAが最も滑らかで綺麗な線になっていることが分かる。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS