PythonのOpenCVモジュールで画像に幾何学図形を描画する方法
はじめに
OpenCVの基本操作のひとつが「画像への描画」です。線、円、矩形(長方形)など、さまざまな幾何学形状を画像上に追加できます。
画像解析の現場では、画像の一部を強調表示したい場面がよくあります。たとえば、注目したい領域を囲む矩形を追加したり、特定の場所を指し示す矢印を描いたりするケースです。本記事では、PythonのOpenCVモジュールを使って画像に幾何学図形を描画する方法を、サンプルコードとともにわかりやすく解説します。
主な描画関数一覧
- cv2.line() … 画像に直線を描画する関数
- cv2.rectangle() … 画像に矩形を描画する関数
- cv2.circle() … 画像に円を描画する関数
- cv2.putText() … 画像にテキストを書き込む関数
- cv2.ellipse() … 画像に楕円を描画する関数
準備:空の画像(キャンバス)を作成する
まず、NumPyのnp.zeros()関数を使って、すべてのピクセルが0(黒)の空の画像を作成します。これが描画用のキャンバスになります。
import numpy as np
import cv2
my_img = np.zeros((350, 350, 3), dtype = "uint8")
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
実行すると、真っ黒なウィンドウが表示されます。この黒いキャンバスに対して、これからさまざまな図形を描いていきます。
直線を描く(cv2.line)
直線を描画するには、cv2.line()関数を使用します。この関数は5つの引数を受け取ります。
- 描画対象の画像オブジェクト
- 始点の座標 (x, y)
- 終点の座標 (x, y)
- 線の色(BGR形式。RGBではない点に注意)
- 線の太さ(ピクセル単位)
サンプルコード
import numpy as np
import cv2
my_img = np.zeros((350, 350, 3), dtype = "uint8")
# 直線を描画
cv2.line(my_img, (202, 220), (100, 160), (0, 20, 200), 10)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
実行結果
矩形(長方形)を描く(cv2.rectangle)
矩形を描画するには、cv2.rectangle()関数を使用します。この関数も5つの引数を受け取ります。
- 描画対象の画像オブジェクト
- 左上の頂点の座標 (x, y)
- 右下の頂点の座標 (x, y)
- 線の色(BGR形式)
- 線の太さ(ピクセル単位)
サンプルコード
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype = "uint8")
# 矩形を描画
cv2.rectangle(my_img, (30, 30), (300, 200), (0, 20, 200), 10)
cv2.imshow('Window', my_img)
# ウィンドウが閉じられるまで画像を表示し続ける
cv2.waitKey(0)
cv2.destroyAllWindows()
実行結果
円を描く(cv2.circle)
円を描画するには、cv2.circle()関数を使用します。引数は以下の5つです。
- 描画対象の画像オブジェクト
- 中心の座標 (x, y)
- 円の半径
- 線の色(BGR形式)
- 線の太さ(ピクセル単位)
サンプルコード
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype = "uint8")
# 円を描画
cv2.circle(my_img, (200, 200), 80, (0, 20, 200), 10)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
実行結果
楕円を描く(cv2.ellipse)
楕円を描画するには、cv2.ellipse()関数を使用します。この関数は8つの引数を受け取ります。
- 描画対象の画像オブジェクト
- 中心の座標 (x, y)
- 短軸と長軸の長さ (h, w)
- 楕円の回転角度(反時計回りで計算)
- 開始角度(時計回りで計算)
- 終了角度(時計回りで計算)
- 線の色(BGR形式)
- 線の太さ(-1を指定すると塗りつぶし)
サンプルコード
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype = "uint8")
# 楕円を描画
cv2.ellipse(my_img,(256,256),(100,50),0,0,180,255,-1)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
実行結果
多角形を描く(cv2.polylines)
多角形を描画するには、cv2.polylines()関数を使用します。必要な引数は以下の5つです。
- 描画対象の画像オブジェクト
- 座標の配列
- 閉じた線にする場合はTrue
- 線の色
- 線の太さ
サンプルコード
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype = "uint8")
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(my_img,[pts],True,(0,255,255))
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
実行結果
テキストを描く(cv2.putText)
OpenCVで画像にテキストを書き込むには、cv2.putText()関数を使用します。引数は以下の通りです。
- 描画対象の画像
- 書き込むテキスト
- テキスト開始点の座標
- 使用するフォント
- フォントサイズ
- 文字色
- 文字の太さ
- 線の種類(アンチエイリアス指定可)
サンプルコード
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype = "uint8")
# テキストを書き込む
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(my_img, 'Tutorials Point', (50, 50), font, 0.8, (255, 0, 0), 2, cv2.LINE_AA)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
実行結果
まとめ
OpenCVには、cv2.line()、cv2.rectangle()、cv2.circle()、cv2.ellipse()、cv2.polylines()、cv2.putText()といった豊富な描画関数が用意されています。これらを組み合わせることで、画像解析結果の可視化や注釈付けなどを簡単に行えます。色指定がBGR形式である点や、線の太さに-1を指定すると図形が塗りつぶされる点など、細かい仕様を押さえておくと、より効果的に活用できるでしょう。
-
PythonとOpenCVを使って動画を逆再生(リバース再生)する方法
OpenCVは「Open Source Computer Vision(オープンソース・コンピュータビジョン)」の略称です。この強力なライブラリを活用することで、画像や動画に対してさまざまな操作を実行できます。OpenCVの主な応用分野顔認識システムモーショントラッキング(動体追跡)人工ニューラルネットワーク深層ニューラルネットワーク動画ストリーミング などOpenCVのインストール方法Windows環境では、以下のコマンドでインストールできます。pip install opencv-pythonLinux環境の場合は、次のコマンドを使用します。sudo apt-get install pyt
-
【Python×OpenCV】画像の収縮(エロージョン)と膨張(ダイレーション)の基本を解説
本記事では、PythonのOpenCVモジュールを使って、エロージョン(収縮)やダイレーション(膨張)といったモルフォロジー演算(形態学的処理)を実行する方法を解説します。 OpenCVはコンピュータビジョン向けに設計されたオープンソースのライブラリで、もともとはIntelによって開発されました。BSDライセンスのもとで誰でも無料で利用できます。 OpenCVの機能を使うには、まずpipでインストールしておきましょう。 sudo pip3 install opencv-python エロージョン(収縮)とは?仕組みを解説 エロージョンは、前景オブジェクトの境界を削り取っていく処理です。画像内の