OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
OpenCVの描画関数

目標

コード

上記のすべての関数では、以下に示すいくつかの共通の引数が見られる:

  • img : 図形を描画したい画像
  • color : 図形の色。BGR の場合はタプルとして渡す。例: 青の場合は (255,0,0)。グレースケールの場合は、スカラー値を渡すだけでよい。
  • thickness : 線や円などの太さ。円のような閉じた図形に対して -1 を渡すと、図形を塗りつぶす。デフォルトの太さ = 1
  • lineType : 線の種類。8 連結か、アンチエイリアス線かなど。デフォルトでは 8 連結である。 cv.LINE_AA はアンチエイリアス線を与え、曲線に対して見栄えがよい。

直線の描画

直線を描画するには、直線の始点と終点の座標を渡す必要がある。黒い画像を作成し、その上に左上から右下の角まで青い直線を描く。

import numpy as np
import cv2 as cv
# Create a black image
img = np.zeros((512,512,3), np.uint8)
# Draw a diagonal blue line with thickness of 5 px
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.

矩形の描画

矩形を描画するには、矩形の左上の角と右下の角が必要である。今回は画像の右上の角に緑色の矩形を描く。

cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
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.

円の描画

円を描画するには、その中心座標と半径が必要である。先ほど描いた矩形の内側に円を描く。

cv.circle(img,(447,63), 63, (0,0,255), -1)
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() のドキュメントを確認すること。以下の例では、画像の中心に半楕円を描く。

cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
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))
cv.polylines(img,[pts],True,(0,255,255))
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

追加リソース

  1. 楕円関数で使用される角度は、通常の円の角度ではない。詳細については、この議論を参照すること。

演習

  1. OpenCV で利用可能な描画関数を使って、OpenCV のロゴを作成してみること。