【Python】OpenCVで超簡単にできる図形描画のやり方を解説!

Python


こんにちは。とりりんです。

今回はPythonOpenCVを使った図形の描画をしたいと思います。

意外とよく使うので、備忘録を兼ねてまとめています。

こんなことが知りたい方向けです。

  • プログラミング初心者の方
  • Pythonを始めてみたい方
  • データ分析に興味がある方
  • 画像処理を実践したい方

是非最後までご覧ください。

スポンサーリンク



四角形の描画(cv2.rectangle())

まず四角形の描画について説明していきます。

四角形の描画はOpenCVのrectangleを使用します。

rectangleはこのような使い方をします。

img = cv2.rectangle(img, coor1, coor2, color)
  • img: 画像(ndarray型)
  • coor1: 左上の座標(タプル型) ex. (20, 10)
  • coor1: 右下の座標(タプル型) ex. (20, 10)
  • color: 色(imread()で開いた場合はBGR) ex. (0, 0, 255)

各座標は(x, y)の順番で記載します。

オプションとしてthicknessで太さを変更することも可能です。

この処理完了後に第一引数のimgは四角形が書かれたものとなります。

戻り値はimgと同じものが返ってくるので、基本的には使用しません(以後の画像処理全てにおいて同様です)。

実際に例として実行した結果がこちらになります。

cv2.rectangle(img, (20, 10), (120, 40), (0, 255, 0))
cv2.rectangle(img, (40, 55), (125, 80), (0, 255, 255), thickness=2)
cv2.rectangle(img, (10, 95), (125, 110), (0, 0, 255), thickness=-1)

imgとcolorについては図形描画では同じ意味を持つため、以降の処理での説明は割愛します。

スポンサーリンク


線分の描画(cv2.line())

次に線の描画について。

線の描画はlineを使用します。

lineはこのような使い方をします。

img = cv2.line(img, coor1, coor2, color)
  • coor1: 開始地点の座標(タプル型) ex. (20, 10)
  • coor1: 終了地点の座標(タプル型) ex. (20, 10)

画像や色はrectangleと同じで、線の太さを示す
thicknessを使用することも可能です。

実際に例として実行した結果がこちらになります。

cv2.line(img, (20, 10), (120, 40), (0, 255, 0))
cv2.line(img, (40, 55), (125, 80), (0, 255, 255), thickness=2)
cv2.line(img, (10, 95), (125, 110), (0, 0, 255), thickness=4)      
スポンサーリンク


矢印の描画(cv2.arrowedLine())

次は矢印の描画について説明します。

矢印の描画はarrowedLineを使用します。

arrowedLineはこのような使い方をします。

img = cv2.arrowedLine(img, coor1, coor2, color)
  • coor1: 開始地点の座標(タプル型) ex. (20, 10)
  • coor1: 終了地点の座標(タプル型) ex. (20, 10)

ほぼlineと同じです。

実際に例として実行した結果がこちらになります。

cv2.arrowedLine(img, (20, 10), (120, 40), (0, 255, 0))
cv2.arrowedLine(img, (40, 55), (125, 80), (0, 255, 255), thickness=2)
cv2.arrowedLine(img, (10, 95), (125, 110), (0, 0, 255), thickness=4      

円の描画(cv2.circle())

次は円の描画になります。

円の描画はcircleを使用します。

circleはこのような使い方をします。

img = cv2.circle(img, coor, size, color)
  • coor: 中心の座標(タプル型) ex. (20, 10)
  • size: 大きさ(int型) ex. 10

circleでは中心座標と大きさを指定することで描画できます。

実際に例として実行した結果がこちらになります。

cv2.circle(img, (20, 10), 2, (0, 255, 0))
cv2.circle(img, (40, 55), 10, (0, 255, 255), thickness=2)
cv2.circle(img, (10, 95), 20, (0, 0, 255), thickness=-1)

スポンサーリンク

楕円の描画(cv2.ellipse())

次は楕円の描画を説明します。

楕円の描画はellipseを使用します。

ellipseはこのような使い方をします。

img = cv2.ellipse(img, (coor, diameter, degree), color)
  • coor: 中心の座標(タプル型) ex. (20, 10)
  • diameter: 長さ(タプル型) ex. (5, 10)
  • degree: 角度(int型) ex. 10

長さはX方向の長さ, Y方向の長さをタプル型で示し、角度は上側からの時計回りの角度になります。

実際に例として実行した結果がこちらになります。

cv2.ellipse(img, ((20, 10), (5, 10), 0), (0, 255, 0))
cv2.ellipse(img, ((40, 55), (25, 80), 20), (0, 255, 255), thickness=2)
cv2.ellipse(img, ((10, 95), (25, 110), 90), (0, 0, 255), thickness=4)

マークの描画(cv2.drawMarker())

次はマークの描画を説明します。

マークの描画はdrawMarkerを使用します。

drawMarkerはこのような使い方をします。

img = cv2.drawMarker(img, coor, color, markerType, markerSize)
  • coor: 中心の座標(タプル型) ex. (20, 10)
  • markerType: マークのタイプ
  • markerSize: マークの大きさ ex. 10

マークのタイプは以下の7種類があります。

マーク 表記
+ 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.drawMarker(img, (20, 10), (0, 255, 0), markerType=cv2.MARKER_TILTED_CROSS)
cv2.drawMarker(img, (40, 55), (0, 255, 255), markerType=cv2.MARKER_DIAMOND, markerSize=20)
cv2.drawMarker(img, (10, 95), (0, 0, 255), thickness=4)
cv2.drawMarker(img, (40, 100), (255, 255, 0), markerType=cv2.MARKER_STAR)
cv2.drawMarker(img, (30, 30), (255, 0, 0), markerType=cv2.MARKER_DIAMOND)
cv2.drawMarker(img, (70, 50), (0, 255, 128), markerType=cv2.MARKER_SQUARE)
cv2.drawMarker(img, (100, 80), (128, 255, 0), markerType=cv2.MARKER_TRIANGLE_UP)
cv2.drawMarker(img, (120, 110), (0, 128, 128), markerType=cv2.MARKER_TRIANGLE_DOWN)
スポンサーリンク


多角形の描画(cv2.polyLines(), cv2.fillPoly(), cv2.fillConvexPoly())

次は多角形の描画を説明します。

多角形の描画はpolyLinesfillPolyfillConvexPolyを使用します。

使い分けに関してはこんな感じです。

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

これら3つの使用方法です。

polyLinesはthicknessを指定しても塗りつぶしができません。

img = cv2.polyLines(img, [pts], isClosed, color)
  • pts: 多角形(リスト型) ex. [np.array(((20, 10), (25, 50)))]
  • isClosed(bool型): 多角形を閉じるか閉じないか ex. True

fillPolyはリストで多角形を表現できるので複数個一気に書けますが、fillConvexpolyと比べて処理がやや遅いです。

img = cv2.fillPoly(img, [pts], color)
  • pts: 多角形(リスト型) ex. [np.array(((20, 10), (25, 50)))]

fillConvexPolyは多角形をndarray型で表現するので1つしか書けませんが、処理が速いです。

img = cv2.fillConvexPoly(img, pts, color)
  • pts: 多角形(numpy.ndarray型) ex. np.array(((20, 10), (25, 50)))

実際にこれら3つを例として実行した結果がこちらになります。

cv2.polylines(img, [np.array(((20, 10), (25, 50), (60, 40)))], True, (0, 255, 0))
cv2.polylines(img, [np.array(((70, 10), (75, 50), (110, 40)))], False, (0, 255, 255), thickness=4)
cv2.fillPoly(img, [np.array(((20, 50), (25, 80), (60, 110), (50, 120), (10, 100))), np.array(((40, 70), (55, 80), (60, 85), (55, 80), (45, 80)))], (0, 0, 255))
cv2.fillConvexPoly(img, np.array(((70, 50), (75, 80), (110, 110), (100, 120), (60, 100))), (255, 255, 0))

スポンサーリンク

文字列の描画(cv2.putText())

最後に文字列の描画を説明します。

文字列の描画はputTextを使用します。

putTextはこのような使い方をします。

img = cv2.putText(img, text, coor, fontType, color)
  • text: 描画する文字列(日本語不可)
  • coor: 左下の座標(タプル型) ex. (20, 10)
  • 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

複雑って何がや!と思うかもしれないので、実例で示します。

    cv2.putText(img, "test", (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), thickness=2)
    cv2.putText(img, "test", (10, 45), cv2.FONT_HERSHEY_PLAIN, 0.7, (255, 0, 0), thickness=2)
    cv2.putText(img, "test", (10, 70), cv2.FONT_HERSHEY_DUPLEX, 0.7, (255, 0, 0), thickness=2)
    cv2.putText(img, "test", (10, 95), cv2.FONT_HERSHEY_COMPLEX, 0.7, (255, 0, 0), thickness=2)
    cv2.putText(img, "test", (10, 120), cv2.FONT_HERSHEY_TRIPLEX, 0.7, (255, 0, 0), thickness=2)
    cv2.putText(img, "test", (65, 20), cv2.FONT_HERSHEY_COMPLEX_SMALL, 0.7, (255, 0, 0), thickness=2)
    cv2.putText(img, "test", (65, 45), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 0.7, (255, 0, 0), thickness=2)
    cv2.putText(img, "test", (65, 70), cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 0.7, (255, 0, 0), thickness=2)
    cv2.putText(img, "test", (65, 95), cv2.FONT_ITALIC, 0.7, (255, 0, 0), thickness=2)

スポンサーリンク

まとめ

今回はPythonでOpenCVを使った図形の描画を解説しました!

今回は下記について紹介しました。

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

意外とよく使うのですが、忘れやすいので備忘録として残しておきました。

OpenCVは便利なので使いこなしていきたいですね。

最後までご覧いただき、ありがとうございました!


Python

↓とりりんを応援して頂けると嬉しいです!↓
にほんブログ村 投資ブログ お金(投資)へ

にほんブログ村

スポンサーリンク


コメント

タイトルとURLをコピーしました