PythonとOpenCVで画像処理③【描画処理】

OpenCVのバージョンは2.4.1です

【元の画像】
*Raspberry Piのカメラで撮影したのでサイズが大きめです
f:id:rkr0314:20160124134123p:plain

【線分】

  • line関数を使えば線を引くことができる
  • cv2.line(画像, 始点座標, 終点座標, 色, 線の太さ)
# -*- coding: utf-8 -*-
import cv2

# 画像の読み込み
img = cv2.imread("test.jpg", 1)

# 画像の高さ、幅を取得
height = img.shape[0]
width = img.shape[1]

# 左上から右下まで、太さ10の赤い線を引く
cv2.line(img, (0, 0), (width-1, height-1), (0, 0, 255), 10)

# 右上から左下まで、太さ50の青い線を引く
cv2.line(img, (width-1, 0), (0, height-1), (255, 0, 0), 50)

# 画像を表示
cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【線分 処理結果】
f:id:rkr0314:20160124134127p:plain


【四角形】

  • rectangle関数を使えば四角形を描くことができる
  • cv2.rectangle(画像, 左上座標, 右下座標, 色, 線の太さ)
    • 線の太さを -1 にすると指定した色で塗りつぶされる
# -*- coding: utf-8 -*-
import cv2

# 画像の読み込み
img = cv2.imread("test.jpg", 1)

# 画像の高さ、幅を取得
height = img.shape[0]
width = img.shape[1]

# 左上から中央まで、太さ50の赤い四角形を描く
cv2.rectangle(img, (0, 0), (width/2, height/2), (0, 0, 255), 50)

# 中央から右下まで、青で塗りつぶされた四角形を描く
cv2.rectangle(img, (width/2, height/2), (width-1, height-1), (255, 0, 0), -1)

# 画像を表示
cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【四角形 処理結果】
f:id:rkr0314:20160124134131p:plain


【円形】

  • circle関数を使えば円形を描くことができる
  • cv2.circle(画像, 中心座標, 半径, 色, 線の太さ)
    • 線の太さを -1 にすると指定した色で塗りつぶされる
# -*- coding: utf-8 -*-
import cv2

# 画像の読み込み
img = cv2.imread("test.jpg", 1)

# 画像の高さ、幅を取得
height = img.shape[0]
width = img.shape[1]

# 中央左寄りに、太さ10の赤い円形を描く
cv2.circle(img, (width/2-200, height/2), 100, (0, 0, 255), 10)

# 中央右寄りに、青で塗りつぶされた円形を描く
cv2.circle(img, (width/2+200, height/2), 100, (255, 0, 0), -1)

# 画像を表示
cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【円形 処理結果】
f:id:rkr0314:20160124134135p:plain


【楕円形、円弧】

  • ellipse関数を使えば楕円形や円弧を描くことができる
  • cv2.ellipse(画像, 中央座標, 長短軸, 回転角度, 円弧開始角度, 円弧終了角度, 色, 線の太さ)
    • 線の太さを -1 にすると指定した色で塗りつぶされる
# -*- coding: utf-8 -*-
import cv2

# 画像の読み込み
img = cv2.imread("test.jpg", 1)

# 画像の高さ、幅を取得
height = img.shape[0]
width = img.shape[1]

# 左上 赤い横長楕円形
cv2.ellipse(img, (width/2-200, height/2-300), (100, 50), 0, 0, 360, (0, 0, 255), 10)
# 右上 青い縦長楕円形
cv2.ellipse(img, (width/2+200, height/2-300), (50, 100), 0, 0, 360, (255, 0, 0), -1)

# 中央左 緑の横長円弧
cv2.ellipse(img, (width/2-200, height/2), (100, 50), 0, 0, 300, (0, 255, 0), 10)
# 中央右 水色の縦長円弧
cv2.ellipse(img, (width/2+200, height/2), (50, 100), 0, 0, 300, (255, 255, 0), -1)

# 左下 ピンクの横長円弧(回転角度60)
cv2.ellipse(img, (width/2-200, height/2+300), (100, 50), 30, 60, 300, (255, 0, 255), 10)
# 右下 黄色の縦長円弧(回転角度60)
cv2.ellipse(img, (width/2+200, height/2+300), (50, 100), 30, 60, 300, (0, 255, 255), -1)

# 画像を表示
cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【楕円形、円弧 処理結果】
f:id:rkr0314:20160124134139p:plain


【文字】

  • putText関数を使えば文字を書くことができる
  • cv2.putText(画像, 文字, 左下座標, フォント, 文字の大きさ, 色, 文字の太さ, 線の種類)
# -*- coding: utf-8 -*-
import cv2

# 画像の読み込み
img = cv2.imread("test.jpg", 1)

# 画像の高さ、幅を取得
height = img.shape[0]
width = img.shape[1]

# フォント指定
fontType = cv2.FONT_HERSHEY_SIMPLEX
# 中央にテキスト描く
cv2.putText(img, "SAMPLE_TEXT", (width/4, height/2), fontType, 7, (0, 0, 255), 3, cv2.CV_AA)

# 画像を表示
cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【文字 処理結果】
f:id:rkr0314:20160124134144p:plain


【参考】
Drawing Functions in OpenCV — OpenCV-Python Tutorials 1 documentation
描画処理 — OpenCV-CookBook
曲線と形状の描画 | OpenCV プログラミング解説