目標
コード
上記のすべての関数では、以下に示すいくつかの共通の引数が見られる:
- img : 図形を描画したい画像
- color : 図形の色。BGR の場合はタプルとして渡す。例: 青の場合は (255,0,0)。グレースケールの場合は、スカラー値を渡すだけでよい。
- thickness : 線や円などの太さ。円のような閉じた図形に対して -1 を渡すと、図形を塗りつぶす。デフォルトの太さ = 1
- lineType : 線の種類。8 連結か、アンチエイリアス線かなど。デフォルトでは 8 連結である。 cv.LINE_AA はアンチエイリアス線を与え、曲線に対して見栄えがよい。
直線の描画
直線を描画するには、直線の始点と終点の座標を渡す必要がある。黒い画像を作成し、その上に左上から右下の角まで青い直線を描く。
import numpy as np
import cv2 as cv
img = np.zeros((512,512,3), np.uint8)
cv.line(img,(0,0),(511,511),(255,0,0),5)
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a line segment connecting two points.
矩形の描画
矩形を描画するには、矩形の左上の角と右下の角が必要である。今回は画像の右上の角に緑色の矩形を描く。
void rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a simple, thick, or filled up-right rectangle.
円の描画
円を描画するには、その中心座標と半径が必要である。先ほど描いた矩形の内側に円を描く。
void circle(InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a circle.
楕円の描画
楕円を描画するには、いくつかの引数を渡す必要がある。1 つ目の引数は中心位置 (x,y) である。次の引数は軸の長さ (長軸の長さ, 短軸の長さ) である。angle は楕円の反時計回りの回転角度である。startAngle と endAngle は、長軸から時計回りに測った楕円弧の始点と終点を表す。すなわち、0 と 360 の値を与えると完全な楕円になる。詳細については、cv.ellipse() のドキュメントを確認すること。以下の例では、画像の中心に半楕円を描く。
void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a simple or thick elliptic arc or fills an ellipse sector.
多角形の描画
多角形を描画するには、まず頂点の座標が必要である。それらの点を ROWSx1x2 の形状の配列にする。ここで ROWS は頂点の数であり、型は int32 でなければならない。ここでは黄色で 4 つの頂点を持つ小さな多角形を描く。
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
void polylines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws several polygonal curves.
- 覚え書き
- 3 番目の引数が False の場合、閉じた図形ではなく、すべての点を結ぶ折れ線が得られる。
- cv.polylines() は複数の線を描画するために使用できる。描画したいすべての線のリストを作成し、関数に渡すだけでよい。すべての線が個別に描画される。これは、各線ごとに cv.line() を呼び出すよりも、線のグループを描画するはるかに優れた高速な方法である。
画像へのテキストの追加:
画像にテキストを入れるには、次のことを指定する必要がある。
- 書き込みたいテキストデータ
- テキストを配置したい位置の座標 (すなわち、データが始まる左下の角)。
- フォントの種類 (サポートされているフォントについては cv.putText() のドキュメントを確認すること)
- フォントスケール (フォントのサイズを指定する)
- color、thickness、lineType などの通常の項目。見栄えをよくするには、lineType = cv.LINE_AA が推奨される。
画像に白色で OpenCV と書き込む。
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,
'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
void putText(InputOutputArray img, const String &text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=LINE_8, bool bottomLeftOrigin=false)
Draws a text string.
結果
そろそろ描画の最終結果を見るときである。前の記事で学んだように、画像を表示して確認する。
image
追加リソース
- 楕円関数で使用される角度は、通常の円の角度ではない。詳細については、この議論を参照すること。
演習
- OpenCV で利用可能な描画関数を使って、OpenCV のロゴを作成してみること。