kansiho's blog

ruby, python, javascript. Rails, wordpress, OpenCV, heroku...

Pythonで初めてのOpenCV【導入〜画像の読み込み・保存・画像への文字書き込み】

f:id:serendipity4u:20170723094041p:plain

OpenCVを入れる

私の場合はpython 2.7環境構築済みだったので以下のコマンドだけで

brew tap homebrew/science
brew install opencv

f:id:serendipity4u:20170722225107p:plain

このように、pythonインタプリタでimportしてもエラーが出ない状態になりました。

それでは触っていきます。以下の説明は、OpenCV-python Tutorial の和訳を中心としています。

画像を読み込む

画像を読み込むには cv2.imread()を利用します。 第2引数で、読み込み方法を指示します。以下のオプションがあります。

  • cv2.IMREAD_COLOR : -1
  • cv2.IMREAD_GRAYSCALE: 0
  • cv2.IMREAD_UNCHANGED: 1

これらのフラグのかわりに1, 0 or -1 の数字でそれぞれを表すことができる。 それではグレースケールで読み込んでみます。つまり、0を渡せばOKです。

img = cv2.imread('messi5.jpg',0)

画像を表示する

cv2.imshow('image',img) # 第1引数はwindow名(重複しないように) , 第2引数は画像オブジェクト
cv2.waitKey(0) # キーボードとのバインディング. 入力待ち時間をミリ秒単位で指定. 引数に 0 を指定した時は,何かしらのキーを打つまでキー入力を無期限で待つ
cv2.destroyAllWindows() # すべてのウィンドウを終了させる

画像が表示された。

f:id:serendipity4u:20170722230345p:plain

画像を保存する

cv2.imwrite('messigray.png',img)

これで、PNGフォーマットで保存することができました。

f:id:serendipity4u:20170722231225p:plain

Matplotlibを利用する

もしグラフ描画ライブラリのmatplotlib を入れていなかったら、pip install matplotlibなどして入れておきましょう。

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('sample.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.show()

これで以下のようにグラフとして表示されます。

f:id:serendipity4u:20170722234903p:plain

webcamの動画を操作する

ライブストリーム画像として動画をとらえます。 webcamの映像を、グレースケールにしてみましょう。

動画をキャプチャするには、VideoCaptureオブジェクトを作成する必要があります。 デバイスのインデックス(PCにつないでいるカメラに割り当てられる数字)か、動画のファイル名を引数で渡してあげればOKです。通常のwebcamがついているPCでは、他にカメラを繋いでいない場合、0にwebcam が割り当てられるので、cv2.VideoCapture(0)webcamのオブジェクトを作成できるはずです。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # フレームごとにキャプチャ
    ret, frame = cap.read()

    # 操作
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 結果のフレームを描画
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'): // q を押すと、終了
        break

# 全部終わったら、キャプチャを解放する
cap.release()
cv2.destroyAllWindows()

これでwebcamで撮っている映像が白黒で表示され、qを押すと抜けることができます。

OpenCVで絵を描く

矩形を描く

img = cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)

円形を描く

中心点と丸みを渡す。

img = cv2.circle(img,(447,63), 63, (0,0,255), -1)

文字を描く

以下のプロパティを指示する。

  • 書き込みたいテキスト
  • どの座標に文字を置きたいか(文字を描画し始めたい箇所を、文字の左下の位置で指示)
  • フォント形式 (cv2.putText()からサポートされているフォントが見られる)
  • フォントサイズ
  • 色や太さなどの設定。
# -*- coding: utf-8 -*-
import cv2

# Create a black image
img = cv2.imread('sample.jpg', 0)
height = img.shape[0]
width = img.shape[1]

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(0,height-20), font, 4,(255,255,255),2,cv2.CV_AA) # 左から0px, 下から20pxのところに描画開始, 色は(255,255,255):白色
while(True):
    cv2.imshow('image',img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()

という感じになりました。

f:id:serendipity4u:20170723094041p:plain

次はエッジ検出、表情検出についてまとめ流予定です。

画像は有村架純さんwikiより引用しました。