#author("2025-04-23T10:13:27+09:00","","")
#author("2025-04-23T10:41:43+09:00","","")
[[log/20250422/佐藤綺羅]]

*描画関数 [#e9a916be]

**cv2.line関数 [#pea63cba]
  cv2.line(入力画像, pt1, pt2, color, thickness, lineType, shift)

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

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

取り込んだ画像~
&attachref(neko.jpeg);~

コード
#code(python){{
 #!/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)
}}

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

**cv2.rectangle関数 [#q80ebb3d]

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

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

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

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

**cv2.circle関数 [#n63d0bea]

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

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

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

プログラム例
 cv2.circle(img, (100,100), 40, (255,0,0), 2)

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

**cv2.drawMarker関数 [#g1916273]

 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)

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

**cv2.putText関数 [#p43525ba]

 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)

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

**補足:lineTypeについて [#ef11f49d]
linetypeには以下の4つが存在する。
|cv2.LINE_4|4連結|
|cv2.LINE_8|8連結(デフォルト)|
|cv2.LINE_AA|アンチエイリアス処理された線|
|cv2.FILLED|塗りつぶし(line, putText関数では使用不可)|

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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS