Python版のOpenCVを利用してみた

OpenCVは、画像や動画を処理するためのコンピュータビジョン向けライブラリです。画像処理、構造解析、パターン認識など多岐に渡ってサポートしており、商用利用も可能なオープンソースのBSDライセンスで提供されています。ここではPython版のOpenCVについて解説していきます。

01: 環境

  • macOS Sierra バージョン10.12.3
  • anaconda3-2.5.0
  • opencv3-3.1.0

02: インストール

bash


# インストール可能なバージョンの一覧表示
$ pyenv install --list

# anaconda3-2.5.0のインストール
$ pyenv install anaconda3-2.5.0
$ pyenv rehash

# グローバル環境の切り替え
$ pyenv global anaconda3-2.5.0

# 仮想環境の作成
$ conda create --name opencv3-3.1.0 python=3.5.1 anaconda

# 仮想環境へ切り替え
$ source $PYENV_ROOT/versions/anaconda3-2.5.0/bin/activate opencv3-3.1.0 

# OpenCVのインストール
$ conda install -c https://conda.anaconda.org/menpo opencv3

pyenvのインストール/使い方については下記リンク先を参照して下さい。

pyenvを利用してPythonの環境を構築する

03: サンプル

二値化

プログラム

threshold.py


import cv2

# グレースケールでファイルを読み込む。
img = cv2.imread("img/test.jpg", cv2.IMREAD_GRAYSCALE)

# 二値化する。
ret, img2 = cv2.threshold(img, 100, 250, cv2.THRESH_BINARY)

# 処理結果をファイルへ書き出す。
cv2.imwrite("test-threshold.jpg", img2)

print(ret)

テスト

入力画像
出力画像

リサイズ

プログラム

resize.py


import cv2

# 画像ファイルを読み込む。
img = cv2.imread("img/test.jpg")

# 画像をsize(x, y)でリサイズする。
img2 = cv2.resize(img, dsize=(360, 220))

# 処理結果をファイルへ書き出す。
cv2.imwrite("img/test-resize.jpg", img2)

テスト

入力画像
出力画像

顔認識

プログラム

face.py


import cv2

cascade_file = "~/.pyenv/versions/anaconda3-2.5.0/envs/opencv3-3.1.0/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"
image_file = "img/test2.jpg"

# 画像の読み込み
img = cv2.imread(image_file)

# グレースケース化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 顔認識を実行
cascade = cv2.CascadeClassifier(cascade_file)
face_list = cascade.detectMultiScale(img_gray, minSize=(150, 150))

if len(face_list) == 0:
    print("顔認識に失敗")
    quit()

# 認識した顔の部分に赤色の枠を描画
for (x, y, w, h) in face_list:
    print("顔の座標=", x, y, w, h)
    color = (0, 0, 255)
    pen_w = 8
    cv2.rectangle(img, (x, y), (x + w, y + h), color, thickness=pen_w)

# 結果の画像を書き出す。
cv2.imwrite("img/test2-face.jpg", img)

テスト

入力画像
出力画像

04: 所感

C++版のOpenCVを利用した経験がありますが、昔と変わらず、使い勝手は良さげですね。ただ、顔認識率はそれほど高くない印象で、顔がバッチリ写っていても認識しないことが多々ありました。顔認識率は下記リンク先で以前紹介したCloud Vision APIの方が高いと思います。

Google謹製のCloud Vision APIを利用してみた