こんにちは、タナカです。
この記事では、opnecvを使って図形を描画する方法を説明します。
この記事の内容
- pythonのopencvを使って図形を描画する方法を備忘録としてまとめる
今回の記事では、下記ライブラリを使用します。
- numpy
- matplotlib
- opencv
数値計算を行うnumpyと図形を描画するmatplotlib、画像処理を行うopencvです。下記コマンドをコマンドプロンプトやターミナルなどに入力しインストールします。
pip install numpy
pip install matplotlib
pip install opencv-python
1. 図形を描画する
下記に示す図形を描画する方法を備忘録としてまとめます。
- 線の描画
- 円の描画
- 四角(正方形や長方形)の描画
2. 画像とは
図形を描画する前にデジタル画像について理解しておく必要があります。画像はピクセルと呼ばれるものの集まりで構成されており、一つひとつに座標(x, y)という情報を持っています。
実際に、画像を拡大すると四角いもので構成されていることがわかり、これがピクセルです。
3. 描画するキャンバスの準備
numpyを使って真っ白な画像(3チャンネル)を作成し、その画像に描画します。画像は8ビットの符号なしデータなので、データ型をuint8にして作成しておく必要があります。
import numpy as np
import matplotlib.pyplot as plt
height = 100
width = 100
# 真っ白な100x100の画像
white = np.ones([height, width, 3], dtype = np.uint8) * 255
# 画像の可視化
plt.imshow(white)
plt.show()
4. 線の描画
線を描画するためには最低2点必要になります。numpyで点を作成し、点と点を結んだ線を描画します。
# pt1: (x1, y1)
# pt2: (x2, y2)
# color: 線の色
# thickness: 線の太さ
# pt1 and pt2 はtupleで書く
cv2.line(img, pt1, pt2, color, thickness = 1)
例)
# ベクトル
p1 = np.array([30, 70])
p2 = np.array([70, 30])
# 線を描画
cv2.line(white, tuple(p1), tuple(p2), (255, 0, 0), 1)
5. 円の描画
円を描画するためには、基準となる中点および半径が必要になります。
# center: 中点(x, y)
# radius: 半径
# color: 線の色
# thickness: 線の太さ
# centerはtupleで書く
cv2.circle(img, center, radius, color, thickness = 1)
例)
# 中点
center = np.array([50, 50])
# 半径
radius = 10
# 円の描画
cv2.circle(white, tuple(center), radius, (255, 0, 0), 2)
cv2.circle(white, tuple(center), radius, (255, 0, 0), -1)
「thickness」を負の値にすると円を塗りつぶして描画することができます。(右の図)
6. 四角(正方形や長方形)の描画
四角を描画するためには、基準点と幅、高さが必要になります。基準点や幅、高さのイメージを示します。
# p1: 基準点(x, y)
# p2: (x + w, y + h)
# ※w: 幅, h: 高さ
# color: 線の色
# thickness: 線の太さ
cv2.rectangle(img, pt1, pt2, color, thickness=1)
例)
# 基準点
p1 = np.array([30, 30])
w = 30 # 幅
h = 30 # 高さ
p2 = np.array([p1[0] + w, p1[1] + h])
# 四角の描画
cv2.rectangle(white, tuple(p1), tuple(p2), (255, 0, 0), 1)
plt.imshow(white)
plt.show()
w = 30の場合(左の図)とw = 50の場合(右の図)
まとめ
今回はopencvで図形を描画する方法を備忘録としてまとめました。
基本的には線や円、四角を書くことが多いので、それらに焦点を当てました。
そのほかの図形についても随時更新していく予定です。