見出し画像

OpenCV入門 (2) - 図形の描画

OpenCVで「図形の描画」を行う方法を説明します。「直線」「円」「矩形」「楕円」「テキスト」を描画します。

・Python 3.7
・OpenCV 4.5

前回

1. インストール

Pythonの仮想環境でOpenCVパッケージをインストール。

$ pip install opencv-python

2.直線

画像1

直線を描画するプログラムは次の通りです。

import numpy as np
import cv2

# 白イメージの生成
img = np.full((256,256,3), 255, np.uint8)

# ラインの描画
cv2.line(img, (0,0), (255, 255), (0, 0, 255), 5)

# イメージの表示
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

直線の描画にはcv2.line()を使います。

img = cv.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
   img: イメージ
   pt1: ラインの始点
   pt2: ラインの終点
   color: 色または明るさ(グレースケールイメージ)
   thickness: ラインの太さ(マイナスは塗り潰し)
   lineType: ラインの種別
       cv.FILLED: 塗り潰し
       cv.LINE_4: 4-connected
       cv.LINE_8: 8-connected
       cv.LINE_AA: アンチエイリアス
   shift: 頂点の小数ビットの数

3. 矩形

画像2

矩形を描画するプログラムは次の通りです。

# 長方形の描画
cv2.rectangle(img, (10, 10), (100, 100), (0,255,0), 5)

矩形の描画にはcv2.rectangle()を使います。

img = cv.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
img = cv.rectangle(img, rec, color[, thickness[, lineType[, shift]]])
   img: イメージ
   pt1: 長方形の頂点
   pt2: pt1の反対側の長方形の頂点
   color: 色または明るさ(グレースケールイメージ)
   thickness: ラインの太さ(マイナスは塗り潰し)
   lineType: ラインの種別
       cv.FILLED: 塗り潰し
       cv.LINE_4: 4-connected
       cv.LINE_8: 8-connected
       cv.LINE_AA: アンチエイリアス
   shift: 頂点の小数ビットの数

4. 円

画像3

円を描画するプログラムは次の通りです。

# 円の描画
cv2.circle(img,(40, 40), 30, (255, 0, 0), -1)

円の描画にはcv2.ellipse()を使います。

img = cv.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
   img: イメージ
   center: 中心点
   radius: 半径
   color: 色または明るさ(グレースケールイメージ)
   thickness: ラインの太さ(マイナスは塗り潰し)
   lineType: ラインの種別
       cv.FILLED: 塗り潰し
       cv.LINE_4: 4-connected
       cv.LINE_8: 8-connected
       cv.LINE_AA: アンチエイリアス
   shift: 頂点の小数ビットの数

5. 楕円

画像4

楕円を描画するプログラムは次の通りです。

# 楕円の描画
cv2.ellipse(img, (40, 40), (30, 30), 0, 0, 180, (0, 0, 255), -1)

楕円の描画にはcv2.ellipse()を使います。

img = cv.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])
img = cv.ellipse(img, box, color[, thickness[, lineType]])
   img: イメージ
   center: 楕円の中心点
   axes: 主軸のサイズの半分
   angle: 回転角度(度)
   startAngle: 弧の開始角度(度)
   endAngle: 弧の終了角度(度)
   color: 色または明るさ(グレースケールイメージ)
   thickness: ラインの太さ(マイナスは塗り潰し)
   lineType: ラインの種別
       cv.FILLED: 塗り潰し
       cv.LINE_4: 4-connected
       cv.LINE_8: 8-connected
       cv.LINE_AA: アンチエイリアス
   shift: 頂点の小数ビットの数

6. 多角形

画像5

多角形を描画するプログラムは次の通りです。

# 多角形の描画
pts = np.array([[10,5],[120,30],[170,120],[50,110]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(img, [pts], True, (0, 255, 0), 5)

多角形の描画にはcv2.polylines()を使います。

img = cv.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])
   img: イメージ
   pts: 多角形曲線の配列
   isClosed: ポリラインが閉じているかどうか
   color: 色または明るさ(グレースケールイメージ)
   thickness: ラインの太さ(マイナスは塗り潰し)
   lineType: ラインの種別
       cv.FILLED: 塗り潰し
       cv.LINE_4: 4-connected
       cv.LINE_8: 8-connected
       cv.LINE_AA: アンチエイリアス
   shift: 頂点の小数ビットの数

7. テキスト

画像6

テキストを描画するプログラムは次の通りです。

# テキストの描画
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'OpenCV', (10,50), font, 1, (255, 0, 0), 1, cv2.LINE_AA)

テキストの描画にはcv2.putText()を使います。

img = cv.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
   img: イメージ
   text: テキスト
   org: テキストの左下隅の座標
   fontFace: フォント種別
       cv.FONT_HERSHEY_SIMPLEX: 通常サイズのSans-Serif
       cv.FONT_HERSHEY_PLAIN: 小サイズのSans-Serif
       cv.FONT_HERSHEY_DUPLEX: 通常サイズのSans-Serif(FONT_HERSHEY_SIMPLEXより複雑)
       cv.FONT_HERSHEY_COMPLEX: 通常サイズのSerif
       cv.FONT_HERSHEY_TRIPLEX: 通常サイズのSerif(FONT_HERSHEY_COMPLEXより複雑)
       cv.FONT_HERSHEY_COMPLEX_SMALL:  小サイズのSerif
       cv.FONT_HERSHEY_SCRIPT_SIMPLEX: 手書き文字
       cv.FONT_HERSHEY_SCRIPT_COMPLEX: 手書き文字(FONT_HERSHEY_SCRIPT_SIMPLEXより複雑)
       cv.FONT_ITALIC: イタリック
   fontScale: フォントスケール(基本サイズを乗算)
   color: 色
   thickness: ライン太さ
   lineType: ラインの種別
       cv.FILLED: 塗り潰し
       cv.LINE_4: 4-connected
       cv.LINE_8: 8-connected
       cv.LINE_AA: アンチエイリアス
   bottomLeftOrigin: true時はイメージの原点は左下隅、False時は左上隅

次回


この記事が気に入ったらサポートをしてみませんか?