LoginSignup
0
3

【Python】OpenCVでの図形や文字列の描画まとめ(四角形・線分・矢印・円・楕円・マーク・多角形)

Last updated at Posted at 2021-12-09

概要

OpenCVでの図形描画を備忘録として纏めました。
今回は下記を紹介。

  • 四角形:cv2.rectangle()
  • 線分:cv2.line()
  • 矢印:cv2.arrowedLine()
  • 円:cv2.circle()
  • 楕円:cv2.ellipse()
  • マーク:cv2.drawMarker()
  • 多角形:cv2.polyLines(), cv2.fillPoly, cv2.fillConvexPoly
  • 文字列:cv2.putText

四角形:cv2.rectangle()

python
img = cv2.rectangle(img, coor1, coor2, color)
  • img : 画像
  • coor1 : 左上の座標(x, y)
  • coor2 : 右下の座標(x, y)
  • color : 色(グレーならint, カラーなら(B, G, R)など)

第一引数と戻り値のimgは共に描画後の画像。
色は**cv2.imread()**で読み込んだ画像ならBGRの順番で。
座標はタプル(x, y)で指定。

※画像と色については以後共通なので説明を省略します。
※今回は表記していませんが、多角形の一部を除きthicknessで太さも指定可能。-1で塗りつぶし。

線分:cv2.line()

python
img = cv2.line(img, coor1, coor2, color)
  • coor1 : 開始地点の座標(x, y)
  • coor2 : 終了地点の座標(x, y)

矢印:cv2.arrowedLine()

python
img = cv2.arrowedLine(img, coor1, coor2, color)
  • coor1 : 開始地点の座標(x, y)
  • coor2 : 終了地点の座標(x, y)

円:cv2.circle()

python
img = cv2.circle(img, coor, radius, color)
  • coor : 中心の座標(x, y)
  • radius : 大きさ(半径)

楕円:cv2.ellipse()

python
img = cv2.ellipse(img, (coor, diameter, degree), color)
  • coor : 中心の座標(x, y)
  • diameter : 各軸の長さ(x, y)
  • degree : 角度(時計回り)

マーク:cv2.drawMarker()

python
img = cv2.drawMarker(img, coor, color, markerType, markerSize)
  • coor : 中心の座標(x, y)
  • markerType : マークのタイプ(下記参照)
  • markerSize : マークの大きさ

マークタイプは下記があります。
どのように描画されるかはこちらに、詳しい説明は公式に書いてあります。

マーク 表記
+ cv2.MARKER_CROSS(or None)
* cv2.MARKER_TILTED_CROSS
cv2.MARKER_STAR
cv2.MARKER_DIAMOND
cv2.MARKER_SQUARE
cv2.MARKER_TRIANGLE_UP
cv2.MARKER_TRIANGLE_DOWN

多角形:cv2.polyLines(), cv2.fillPoly, cv2.fillConvexPoly

多角形は3種類ありますが、以下の用途で使い分けするのが良いと思います。

種類 場合
cv2.polyLines 塗りつぶしをしない時
cv2.fillPoly 塗りつぶしをする+複数図形を描画する時
cv2.fillConvexPoly 塗りつぶしをする+1つの図形を描画する時

多角形を塗り潰さずに描画:cv2.polyLines()

python
img = cv2.polyLines(img, [pts], isClosed, color)
  • pts : 多角形(リスト)
  • isClosed : 多角形を閉じる(True)か閉じない(False)か

thickness=-1(塗りつぶし)をしてもエラーが発生。

1つ以上の多角形を塗り潰して描画:cv2.fillPoly()

python
img = cv2.fillPoly(img, [pts], color)
  • pts : 多角形(リスト)

ptsがリストで表現されるため、複数個を一気に描画可能。

1つの多角形を塗りつぶす:cv2.fillConvexPoly()

python
img = cv2.fillConvexPoly(img, pts, color)
  • pts : 多角形(numpy.ndarray)

ptsがndarrayなので1つしか描画できないが、描画速度が速い。

文字列:cv2.putText

python
img = cv2.putText(img, text, coor, fontType, color)
  • text : 描画する文字列(日本語不可)
  • coor : 左下の座標
  • fontType : フォントのタイプ

fontTypeには下記の種類があります。
フォントの見た目についてはこちら、説明は公式を参照してください。

フォント 表記
サンセリフ cv2.FONT_HERSHEY_SIMPLEX
サンセリフ(サイズ小) cv2.FONT_HERSHEY_PLAIN
サンセリフ(複雑) cv2.FONT_HERSHEY_DUPLEX
セリフ cv2.FONT_HERSHEY_COMPLEX
セリフ(複雑) cv2.FONT_HERSHEY_TRIPLEX
セリフ(サイズ小) cv2.FONT_HERSHEY_COMPLEX_SMALL
手書きスタイル cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
手書きスタイル(複雑) cv2.FONT_HERSHEY_SCRIPT_COMPLEX
イタリック cv2.FONT_ITALIC

その他

紹介した実例のソースコードをGitHubにも置いています。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3