概要
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にも置いています。