こんにちは三谷です。
今回は、最近流行しているディープラーニングの中でも注目を集めている画像認識でよく使用される無料ライブラリ「OpenCV」の使い方について徹底解説します!
OpenCVとは?
OpenCVは、画像処理・画像解析および機械学習等の機能を持つオープンソースのライブラリです。Pythonを始め、C/C++、Java、MATLAB用として公開されており、もともとはインテルが開発・公開しています。
無料でOpenCVを使った画像認識の環境を構築する方法
OpenCVを使った環境を構築するには、以下の作業が必要です。
・Pythonのインストール
・Pycharmのインストール
・OpenCVのインストール
インストールの方法はこちらの記事(画像編集用ライブラリ「OpenCV」のインストール方法.docx)にまとめてありますのでチェックしてみてくださいね。
OpenCVの基本的な使い方(画像の読み込み)
OpenCVでは画像を取り扱います。画像データを処理するために、OpenCVで画像を読み込む方法をご紹介します。
参考記事:動画の読み込み方法についても紹介しています。
OpenCVのimreadを使って画像・映像を読み込む方法.docx
Locationに「opencv」と入力し[Create]をクリックします。Pycharmでは、プロジェクトという単位でプログラムを管理することができます。プロジェクトは、指定したLocationのディレクトリに作られたフォルダです。
ダイアログボックスから「Python File」を選びます。
「Name」に「image.py」と入力し[OK]をクリックします。
使用するライブラリをインポートします。OpenCVはcv2でインポートできます。また、Matplotlibはグラフ描画ライブラリとして、インポートした画像を視覚化(ビジュアライズ)するときに使用されます。
import cv2import matplotlib.pyplot as plt
image = cv2.imread("image.jpg")
テキスト ボックス画像を読み込みます。画像を読み込むにはimreadという関数を使用します。
このように、フォルダパスを書かずに読み込むと、pythonファイルと同階層のディレクトリにある画像が読み込まれます。
つまり、今回の場合は、「image.py」を保存したプロジェクトフォルダの中に、同じ名前のファイル名(image.jpg)として任意の画像ファイルを保存しておく必要があります。
image=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
テキスト ボックス読み込んだ画像をRGBに変換します。
OpenCVで読み込む画像データの色情報は、一般的なRGB形式ではなく、BGR形式で読み込まれます。このまま表示させようとすると、色合いがおかしくなるため、COLOR_BGR2RGBで色を変換しています。
Pythonに関連するライブラリや関数では、「2」を「to」の意味で使用することが多くあります。BGR2RGBは、「BGR to RGB」、つまり「BGRをRGBに」と言う意味で使われています。
plt.imshow(image)plt.show()
テキスト ボックス顔認識した画像を表示させます。
[Run]-[Run]で「image.py」を選択し機械学習プログラムを実行します。画像が表示されます。
OpenCVで顔認識する方法
OpenCVでは、あらかじめ用意されたファイルを使用することで、人間や猫の顔認識をすることができます。
あらかじめ用意されたファイルというのは「カスケードファイル」と呼ばれるもので、既に学習が完了している学習器です。
カスケードファイルは以下のページより無料でダウンロードできます。
https://github.com/opencv/opencv/tree/master/data/haarcascades
今回は、人の顔を正面から認識できる「haarcascade_frontalface_alt.xml」をダウンロードし、プロジェクトフォルダ内に保存してください。
顔認識以外でも様々なカスケードファイルがあらかじめ用意されています。
ファイル名 | 内容 |
---|---|
haarcascade_eye.xml | 目 |
haarcascade_eye_tree_eyeglasses.xml | 眼鏡 |
haarcascade_frontalcatface.xml | 猫の顔(正面) |
haarcascade_frontalcatface_extended.xml | 猫の顔(正面) |
haarcascade_frontalface_alt.xml | 顔(正面) |
haarcascade_frontalface_alt_tree.xml | 顔(正面) |
haarcascade_frontalface_default.xml | 顔(正面) |
haarcascade_fullbody.xml | 全身 |
haarcascade_lefteye_2splits.xml | 左目 |
haarcascade_lowerbody.xml | 下半身 |
haarcascade_profileface.xml | 顔(証明写真) |
haarcascade_righteye_2splits.xml | 右目 |
haarcascade_smile.xml | 笑顔 |
haarcascade_upperbody.xml | 上半身 |
早速プログラムを作ってみましょう。
[File]-[New]で新しくファイルを作成します。ダイアログボックスから「Python File」を選びます。
「Name」に「face.py」と入力し[OK]をクリックします。
使用するライブラリと画像をインポートします。画像ファイルは人の顔が写った任意の写真を、プロジェクトフォルダ内に保存しておいてください。
import cv2 import matplotlib.pyplot as pltimage = cv2.imread("face.jpg")image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
今回は、人の顔認識ができる「haarcascade_frontalface_alt.xml」を使用します。CascadeClassifierでカスケードファイルを読み込めます。
casceade_file = "haarcascade_frontalface_alt.xml"cascade = cv2.CascadeClassifier(casceade_file)
顔を認識し矩形にリスト化します。例:[55, 68, 150, 150]
face_list = cascade.detectMultiScale(image)
cascade.detectMultiScale(image)は、顔を検出してリスト化する関数です。
リストは、画像の左上を(0, 0)の原点とし、顔の位置の[Xの座標, Yの座標, 幅, 高さ]という数値のリストです。
顔を囲う枠の色をあらかじめ指定しておきます。色の指定はRGB形式のため、青の場合は(0, 0, 255)と指定します。
color=(0, 0, 255)
顔を認識した箇所に枠を描画するプログラムを作成します。
if len(face_list) > 0 :for face in face_list :x, y, w, h = face cv2.rectangle(image, (x,y), (x+w, y+h), color, thickness=2) else: print("顔が認識できませんでした。")
顔認識した画像を表示させます。
plt.imshow(image)plt.show()[Run]-[Run]で「face.py」を選択し機械学習プログラムを実行します。
画像が表示されます。
OpenCVで画像のノイズを除去するスムージングをする方法
OpenCVでは、フィルター処理も行えます。画像データによってはノイズがのっているものもあるため、ノイズ除去のためにスムージング処理を行なうこともしばしばあります。
今回はスムージング処理の中でも、ガウシアンフィルターというフィルターを掛けて画像スムージングをしてみます。
ダイアログボックスから「Python File」を選びます。
「Name」に「smooth.py」と入力し[OK]をクリックします。
使用するライブラリをインポートします。
import cv2import matplotlib.pyplot as pltimage = cv2.imread("face.jpg")image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
ガウシアンフィルターの関数を用意します。
#スムージング(ガウシアンフィルター)defblur(img):filtered = cv2.GaussianBlur(img, (11, 11), 0)return filtered
画像をガウシアンフィルターでスムージングします。
img_gaussian = blur(image)
画像を表示します。
plt.imshow(img_gaussian)plt.show()[Run]-[Run]で「smooth.py」を選択し機械学習プログラムを実行します。
画像が表示されます。
まとめ
いかがだったでしょうか。OpenCVは、今回ご紹介した処理の他にも様々な処理を行える機能を持っています。
