長野エンジニアライフ

東京から長野に移住したエンジニアのブログです。🦒🗻⛰

Python + OpenCV4プログラミングの学習(3)〜グラフィックス〜

本記事はOpenCVによるグラフィックスを行ったときの備忘録である。

事前準備

以下の記事で仮想環境opencvEnvを構築していることを前提とする。 kawakeee.hatenablog.com

円を描く

以下のコードを写経しcircle.pyのファイルを作成。

import numpy as np
import cv2

# 画像データ(400×400 px)の生成
img = np.zeros((400, 400, 3), np.uint8)
# 円の描写 (対象画像データ, 中心座標, 半径, 色情報, 円の太さ)
cv2.circle(img, (200, 200), 50, (255, 0, 0) ,1)
cv2.imwrite('img/circle1.jpg', img)
cv2.imshow('img1', img)

img = np.zeros((400, 400, 3), np.uint8)
# 半径 色 太さ を変更 
cv2.circle(img, (200, 200), 100, (0, 255, 0) ,3)
cv2.imwrite('img/circle2.jpg', img)
cv2.imshow('img2', img)

img = np.zeros((400, 400, 3), np.uint8)
# 半径 色 太さ を変更
cv2.circle(img, (200, 200), 150, (0, 0, 255) ,-1)
cv2.imwrite('img/circle3.jpg', img)
cv2.imshow('img3', img)

cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.circle(...):円の描写
    使用例:cv2.circle(img, (200, 200), 50, (255, 0, 0) ,1)
    引数は、順に(対象画像データ, 中心座標, 半径, 色情報, 円の太さ)を表す。

cv2.waitKey(0)によってキーが押されるまで以降のコードは実行されない。何かのキーが押されるとcv2.destroyAllWindows()で全てのウィンドウが閉じられてプログラムが終了する。

実行確認

(opencvEnv)$ python circle.py

指定フォルダ配下に画像が生成されていることを確認。
OpenCV4による円の描写

また、cv2.imshowによってウィンドウで画像が表示される事を確認。
ウィンドウで表示される事を確認

線を描く

次に、任意の画像に対して線を描く。今回はLenna.jpgを用意した。

Lenna

以下のコードを写経しlines_on_image.pyのファイルを作成。

import cv2

try:
  img = cv2.imread('img/Lenna.jpg')
  if img is None:
    print('ファイルを読み込めません')
    import sys
    sys.exit()
  
  # 画像に対して線を描く (対象画像, 始点, 終点, 色)
  cv2.line(img, (50, 50), (200, 50), (255, 0, 0))
  # 追加して太さも指定
  cv2.line(img, (50, 100), (200, 100), (0, 255, 0), 5)
  cv2.imwrite('img/LinesOnImage.jpg', img)
  cv2.imshow('img', img)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

except:
  import sys
  print("Error:", sys.exc_info()[0])
  print(sys.exc_info()[1])
  import traceback
  print(traceback.format_tb(sys.exc_info()[2]))
  • cv2.line(...):線の描写
    使用例:cv2.line(img, (50, 50), (200, 50), (255, 0, 0)) 引数は、順に(対象画像, 始点, 終点, 色)を表す。

実行結果

(opencvEnv)$ python lines_on_image.py

指定フォルダ配下にLinesOnImage.jpg生成され、線が描写された画像がウィンドウに表示される事を確認。
OpenCVによって画像に線が描写されている事を確認

画像上に円を描く

次に、Lenna.jpgに対してを描く。 以下のコードを写経しcircles_on_image.pyのファイルを作成。

import cv2

try:
  img = cv2.imread('img/Lenna.jpg')
  if img is None:
    print('ファイルを読み込めません')
    import sys
    sys.exit()
  
  # 画像に対して円を描く
  cv2.circle(img, (50, 50), 40, (0, 255, 0), 2)
  cv2.circle(img, (150, 150), 80, (255, 255, 0), 6)
  cv2.circle(img, (200, 200), 50, (0, 255, 255), -1)
  cv2.imwrite('img/CirclesOnImage.jpg', img)
  cv2.imshow('img', img)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

except:
  import sys
  print("Error:", sys.exc_info()[0])
  print(sys.exc_info()[1])
  import traceback
  print(traceback.format_tb(sys.exc_info()[2]))

円・線の描写で学んだ関数を使用し画像上に3つの円を描くよう記述。

実行結果

(opencvEnv)$ python circles_on_image.py

指定フォルダ配下にCirclesOnImage.jpg生成され、円が描写された画像がウィンドウに表示される事を確認。
OpenCVを利用した円描写

画像上に文字を描く

次に、Lenna.jpgに対して文字を描く。
以下のコードを写経しdraw_text.pyのファイルを作成。

import cv2

try:
  img = cv2.imread('img/Lenna.jpg')
  if img is None:
    print('ファイルを読み込めません')
    import sys
    sys.exit()
  
  # 画像に対して文字を描く
  cv2.putText(img, 'Hello OpenCV', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
     (150, 60, 80), 2)
  cv2.imwrite('img/puttext.jpg', img)
  cv2.imshow('img', img)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

except:
  import sys
  print("Error:", sys.exc_info()[0])
  print(sys.exc_info()[1])
  import traceback
  print(traceback.format_tb(sys.exc_info()[2]))
  • cv2.putText(...):文字の描写
    使用例:cv2.putText(img, 'Hello OpenCV', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (150, 60, 80), 2) 引数は、順に(対象画像,文字列,表示位置, フォント,サイズ,色,太さ)を表す。

実行結果

(opencvEnv)$ python draw_text.py

指定フォルダ配下にputtext.jpg生成され、文字が描写された画像がウィンドウに表示される事を確認。
OpenCVによる文字描写

まとめ

  • cv2.circle(...):円の描写
  • cv2.line(...):線の描写
  • cv2.putText(...):文字の描写

ソースコード

github.com