【Pythonで画像処理をはじめよう】OpenCVの使い方を解説

ライブラリが豊富でさまざまな開発が行えるPythonでは、画像処理も簡単に実現できます。近年、AI(人工知能)の発達によってPythonの人気も高まっていますが、AIの画像処理で利用されることの多い「OpenCV」はご存知でしょうか。OpenCVを利用すれば、顔認識や追跡などの画像処理を非常に簡潔なコードで記述できます。

この記事では、OpenCVの概要からインストール手順、基本的な操作方法と併せて、顔認識を実現するための方法を解説します。

OpenCVとは?

OpenCVはインテル社が開発・公開しているオープンソースのライブラリです。もともとはOpen Source Computer Vision Libraryという名称でしたが、2006年にOpenCVとして生まれ変わりました。OpenCVは商用利用であっても無料で利用でき、画像処理や画像解析、機械学習向けの機能が集約されています。例えば、線やテキストなどの画像の描画、グレースケール化、顔認識、文字認識、物体の検出なども簡潔なコードで実現できます。

また、AIの機械学習にも利用でき、画像認識系のAI開発では欠かせない存在といえるでしょう。

顔認識

OpenCVはPythonやJavaなどで利用可能

2022年9月時点での最新バージョンは、2022年6月に公開された4.6.0です。OpenCVの4系は、PythonやJava、C++で利用できます。OSもWindowsやMac、Linuxだけでなく、AndroidやiOSにも対応しているため、OpenCVを活用したアプリ開発も可能です。近年では、AIに関連するライブラリの豊富さからPythonの人気が高まっており、OpenCVには機械学習の機能もあるため、Pythonで利用されることの多いライブラリです。

OpenCVのインストール手順

Pythonを使ってOpenCVをインストールする手順を紹介します。Pythonはインストール済みの前提で進めますので、Pythonの環境構築がまだの方は「Pythonの開発環境はどうすれば良い?統合開発環境もまとめて解説!」を参考に開発環境を用意してください。

  • Windowsの場合

Windowsではコマンドプロンプトを開き、次のコマンドを入力してOpenCVをインストールします。

「pip install opencv-python」

※画像はAnacondaを利用した開発環境の例

OpenCVをインストールする際にはnumpyも必要です。インストールされていない場合はOpenCVと併せてインストールされます。インストール後は「pip list」コマンドを使って確認するとよいでしょう。

  • Macの場合

Macも同様にターミナルを開き、「pip install opencv-python」コマンドを入力します。

なお、環境によって利用するコマンドが変わる場合もありますが、基本的にはpipコマンドを使ってインストールする方法が最も手軽です。

\文字より動画で学びたいあなたへ/

Udemyで講座を探す >

OpenCVをPythonで使ってみよう!基本操作を解説

実際にOpenCVをPythonで使う場合の基本操作を見ていきましょう。PythonでOpenCVを利用する際には、「import cv2」としてインポートした状態で進めます。ここから先は、わかりやすくするためにJupyter Notebookを利用していきます。フォルダ構成は次の通り、スクリプト名を「OpenCV-practice」とし、画像を「image」フォルダに格納している状態です。

 

画像の読み込み・表示・保存

画像の読み込み・表示は次の命令で行います。

「cv2.resize(画像のオブジェクト, dsize=(高さ,幅))」
「cv2.resize(画像のオブジェクト, dsize=None, fx=倍数, fy=倍数)」

cv2.imreadで読み込んだ画像は「img」変数に格納し、cv2.imreadに指定して表示することで、画像の通り猫の画像が表示されるようになりました。その他にも、表示する際には次の命令も併せて覚えておきましょう。

cv2.waitKey(0):待機命令(キー入力があるまで待機)
cv2.destroyAllWindow:すべてのウィンドウを破棄

waitKeyとdestroyAllWindowはimshowとセットで利用することが多い命令です。

画像を保存する際は、「cv2.imwrite(保存先, 画像のオブジェクト)」で行います。命令を実行すると次のように画像が保存されました。

 

画像のトリミング・リサイズ

画像のトリミングはスライスを使って画像の範囲を指定することで実現できます。画像の例では、高さをy軸の0~120で指定、幅をx軸の120~250で指定しました。先程の猫画像の顔部分だけがトリミングされていることが分かるでしょう。また、リサイズは「cv2.resize」で行います。大きく2つの方法があるため、用途に合わせて選択しましょう。

「cv2.resize(画像のオブジェクト, dsize=(高さ,幅))」
「cv2.resize(画像のオブジェクト, dsize=None, fx=倍数, fy=倍数)」

dsizeを指定すればピクセル単位での調整が可能であり、fxやfyを指定して倍数で調整することも可能です。今回の例では、fxとfyを0.5(50%)として出力しているため、画像のサイズが半分になっています。

 

画像のグレースケール化

グレースケールはカラー画像を白黒画像に変換する処理です。白と黒だけの2値化とは異なり、色の濃淡の明暗を分けます。画像認識では認識率を高めるために、余計な情報を削減する方法として頻繁に利用されます。OpenCVでは次の命令を実行するだけで簡単にグレースケール処理が完了します。

「cv2.cvtColor(画像のオブジェクト, COLOR_BGR2GRAY)」

 

画像の2値化

グレースケールは完全な白黒画像ではありませんでしたが、2値化によって白と黒の2色に変換できます。2値化は顔や物体などの輪郭を明確にでき、画像内の対象をより際立たせるために利用される処理です。OpenCVでは「cv2.threshold」を使ってしきい値を設定し、画素がしきい値以上であれば黒(または白)、しきい値以下であれば白(または黒)に変換します。

cv2.threshold(グレースケール画像のオブジェクト, 下限値, 上限値, 2値化の方法)

今回の例では、2値化の方法として「cv2.THRESH_BINARY」と「cv2.THRESH_BINARY_INV」の2種類を利用しました。cv2.THRESH_BINARYでは、画素が127以下なら黒、それ以外なら白に変換し、cv2.THRESH_BINARY_INVでは反転します。2値化がうまくいかない場合は、下限値・上限値のしきい値を変更して調整してください。

 

画像への描画・輪郭を縁取る

OpenCVでは円や長方形といった描画も簡単に行なえます。画像内の検出箇所に図形を描画するなどの使い方が可能です。また、オブジェクトを検出して輪郭を縁取ることも可能ですので、ここでは簡単な図形の描画と輪郭の縁取りを行ってみましょう。コードの全文は次のとおりです。

今回は簡単な図形の描画と輪郭の縁取りのために、numpy.zerosを使ってキャンバスを描画し、その上に図形を描画していきます。円や長方形の描画は次の命令で行えます。

円の描画:cv2.circle(画像のオブジェクト, (描画位置y軸,描画位置x軸), 半径, (色), 枠の太さ)

長方形の描画:cv2.rectangle(画像のオブジェクト, (描画開始y軸,描画開始x軸), (描画終了y軸,描画終了x軸), (色), 枠の太さ)

色:(青色,緑色,赤色)で指定し、枠の太さは「thickness」で指定しています。thicknessは-1とすることで塗りつぶされる仕様です。

その後、縁取り処理のためにグレースケール・2値化を実施し、縁取り対象のオブジェクトの検出には「cv2.findContours」、縁取り処理には「cv2.drawContours」を使用しています。

検出:cv2.findContours(2値化画像オブジェクト, 検索モード, 検出方法のフラグ)
描画:cv2.drawContours(描画先の画像オブジェクト, 検出リスト, リストインデックス,  (色), 枠の太さ)

cv2.findContoursは検出されたすべての輪郭がlistで返します。注意点として、OpenCVでは黒の背景から白の物体の輪郭を探すことを前提としているため、2値化の際には注意しましょう。検出リストを使ってcv2.drawContoursで描画しますが、リストインデックスに-1を指定するとすべての検出オブジェクトが対象となります。

画像のヒストグラム表示

画像を分析してヒストグラムとして表示することも可能です。ヒストグラムは度数分布を示すグラフであり、この例では青色・緑色・赤色でそれぞれの分布が確認できます。

OpenCVでヒストグラムを作成するためには、「cv2.calcHist」を使用します。

cv2.calcHist(画像オブジェクト, チャンネル, マスク, ヒストグラムのサイズ, ヒストグラムのレンジ)

チャンネルはグレースケールであれば0、カラー画像の場合はBGRの色相に対応する0~2を指定します。今回はすべての色相をチェックするため、for文で繰り返し処理しています。ヒストグラムのサイズやレンジは、一般的には全画素値を対象にするため[256][0,256]を指定しておきましょう。

なお、この例では各パラメータにラベル(images=など)を与えていますが、与えなくても問題ありません。ヒストグラムの描画に必要なデータは「cv2.calcHist」で取得し、グラフの出力にはMatplotlibを使用しています。

Python + OpenCVで簡単に顔認識が実現

OpenCVの基本操作+αで人物画像の顔認識を行ってみましょう。今回は次の画像を使って顔認識を行います。

OpenCVでは人物の顔や体などを検出するための学習データが用意されているため、そちらを利用します。開発環境によって保存場所は異なりますが、デフォルトでは「Pythonインストールディレクトリ\Lib\site-packages\cv2\data」配下に保存されています。

ファイルが見つからない場合は「haarcascade」で検索するとよいでしょう。対象のフォルダ配下には、複数の学習データが保存されていますが、今回はそのなかから「haarcascade_frontalface_alt.xml」を利用します。

対象のファイルをコピーし、実行ファイルのフォルダに「data」フォルダを作成して配下に保存します。

学習データが見つからない場合には、公式サイトで利用するバージョンのソースを入手し、そこからコピーしてもよいでしょう。

顔検出するためのコードとしては、「cv2.CascadeClassifier」で学習データを読み込み、「detectMultiScale」で検出、「cv2.rectangle」で顔を囲むようにしています。

cv2.CascadeClassifier(学習データ(検出器)のパス)」
「検出器.detectMultiScale(グレースケールのオブジェクト, 縮小量, 最低サイズ)」

detectMultiScaleで検出する精度を高めるために、カラー画像をそのまま利用するのではなく一旦グレースケール化した画像を利用しています。また、検出結果はリストとして返されるため、検出結果リストをfor文で回しながら短形描画で顔部分を囲みます。

顔が認識されて赤い枠で囲まれました。

UdemyでOpenCVを使った画像処理をもっと詳しく学ぼう!

今回紹介したOpenCVの機能はほんの一部です。より高度な画像処理や高精度な画像認識、機械学習などOpenCVを使えばさまざまな画像処理が実現できます。今回は初心者向けに基礎的な使い方だけを解説していますので、「より詳しく知りたい」「高度な使い方を学びたい」という方には、次のような動画講座がおすすめです。

【Pythonで学ぶ】OpenCVでの画像処理入門
MediaPipe・OpenCV・Pythonで体験する画像認識技術の世界【初学者向け】
画像処理の基礎:フィルタリング、パターン認識から撮像過程モデルまで

Udemyでは初心者から中級・上級者向けまで、幅広く動画講座を用意しています。OpenCVを使いこなしたい方は、Udemyの動画講座で学習してみてはいかがでしょうか。

OpenCVは画像処理や画像解析・機械学習向けの機能が集約されたオープンソースのライブラリです。Python・Java・C++で利用でき、画像認識のためにPythonで利用されることが多いライブラリといえるでしょう。OpenCVを使えば、簡単な画像処理からオブジェクトの認識、顔認識など幅広く高度な画像処理を実装できます。誰でも無料で簡単に利用できるため、この記事を参考にOpenCVを使ってみましょう。