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

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

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

## 四角形：cv2.rectangle()

``` python: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:python
img = cv2.line(img, coor1, coor2, color)
```

- **coor1** : 開始地点の座標（x, y）
- **coor2** : 終了地点の座標（x, y）




## 矢印：cv2.arrowedLine()
```python:python
img = cv2.arrowedLine(img, coor1, coor2, color)
```

- **coor1** : 開始地点の座標（x, y）
- **coor2** : 終了地点の座標（x, y）


## 円：cv2.circle()

```python:python
img = cv2.circle(img, coor, radius, color)
```

- **coor** : 中心の座標（x, y）
- **radius** : 大きさ（半径）



## 楕円：cv2.ellipse()

```python:python
img = cv2.ellipse(img, (coor, diameter, degree), color)
```

- **coor** : 中心の座標（x, y）
- **diameter** : 各軸の長さ（x, y）
- **degree** : 角度（時計回り）


## マーク：cv2.drawMarker()

```python:python
img = cv2.drawMarker(img, coor, color, markerType, markerSize)
```

- **coor** : 中心の座標（x, y）
- **markerType** : マークのタイプ（下記参照）
- **markerSize** : マークの大きさ

マークタイプは下記があります。
どのように描画されるかは[こちら](https://atchicken.com/opencv_shape/)に、詳しい説明は[公式](https://docs.opencv.org/3.4.0/d6/d6e/group__imgproc__draw.html#ga0ad87faebef1039ec957737ecc633b7b)に書いてあります。

|マーク|表記|
|:------:|:-------:|
|+|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

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

|種類|場合|
|:------:|:-------:|
|cv2.polyLines|塗りつぶしをしない時|
|cv2.fillPoly|塗りつぶしをする＋複数図形を描画する時|
|cv2.fillConvexPoly|塗りつぶしをする＋１つの図形を描画する時|

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

```python:python
img = cv2.polyLines(img, [pts], isClosed, color)
```

- **pts** : 多角形（リスト）
- **isClosed** : 多角形を閉じる（True）か閉じない（False）か

**thickness**=-1（塗りつぶし）をしてもエラーが発生。

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

```python:python
img = cv2.fillPoly(img, [pts], color)
```

- **pts** : 多角形（リスト）

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

### １つの多角形を塗りつぶす：cv2.fillConvexPoly()

```python:python
img = cv2.fillConvexPoly(img, pts, color)
```

- **pts** : 多角形（numpy.ndarray）

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

## 文字列：cv2.putText

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

**fontType**には下記の種類があります。
フォントの見た目については[こちら](https://atchicken.com/opencv_shape/)、説明は[公式](https://docs.opencv.org/3.4.0/d0/de1/group__core.html#ga0f9314ea6e35f99bb23f29567fc16e11)を参照してください。

|フォント|表記|
|:------:|:-------:|
|サンセリフ|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にも置いています。

https://github.com/khfkd/opencv_shape