今回はopenCVの具体的な使い方についてご紹介いたします。openCVは画像及び映像認識用のライブラリコンテンツで、AI解析の最前線で用いられているほど主流なpythonライブラリです。今まで様々なライブラリやパッケージをご紹介しましたが、筆者的にはopenCVが一番学習しやすかったと記憶していますし、拡張性という観点からもぜひ皆様にマスターしていただきたいので、今回共有させて頂こうと考えました。
二部構成で紹介する予定なので次回以降の記事についても、ご期待いただければ幸いです。

openCVとは?

コンピュータから見た景色や人の映像をここではコンピュータービジョンとして話を進めていきます。コンピュータビジョンは、コンピュータビジョンに関連するタスクを実行するようにコンピュータをプログラム/コード化する、幅広い研究分野です。簡単に言うと、コンピュータビジョンの助けを借りて、顔認識、画像のぼかし、自律走行、人の顔を別の人の顔に変える(Deep Fake)などの視覚的な情報をコンピュータが視認できるということです。コンピュータビジョン関連のライブラリはたくさんありますが、ここではOpenCV(オープンソース)ライブラリとpythonプログラミングを中心に紹介します。この記事では、アルゴリズムの背後にある数学的な話ではなく、実用的なアプローチに焦点を当てます。

外部マニュアルはこちら

OpenCVのチュートリアルに深く入る前に、まず基本的なことを学んでいきましょう

コンピュータビジョンは、主に数字のみのcsvファイルや実際に撮影した画像(png,jpg)を扱います。
ご存知のように、コンピュータは、2進数、デジタル画像、ビデオのフレームを、大きなピクセルマトリックスの形で判別することができます。そのバックグラウンドでは、巨大なピクセルを2進数に変換するための変換作業が行われています。
デジタル画像には2種類あります。グレースケール画像(簡単に言えば白黒画像のことで、もっと専門的に解説すると黒の濃淡によって現した画像です)、グレースケール画像では、ピクセルを表すのに1つのチャンネル(色のチャンネル)しかありません。カラー画像。各ピクセルは、3つのカラーチャンネルの強度を示します。カラー画像では、R、G、Bの3つの色チャンネルがあります。Rは赤、Gは緑、Bは青を表しています。OpenCV は,BGR (Blue Green Red) 形式で画像を読み込みます。OpenCVは,符号なし整数(int8)データ型で画像を読み込みます。濃淡の度合いは0から255までの数字的に度合いによって表現します。一般的には数字が大きければ大きいほど濃いということになります。
グレースケール画像のピクセルの範囲は,(0-255)
カラースケール画像のピクセルの範囲は,(0-255)

前提条件

前回までjupyterと呼ばれるpythonが標準装備された仮想環境を使用したのですが今回はローカル環境下(お手持ちのPC)でpythonをインストール及び環境変数(パス)を繋いだ上で実装したものをご紹介するので、未構築の方は是非力試しと思ってトライしてみてください。
OS:Windows
python3.5以上
Windowsにpythonをインストールするには、Pythonの公式ウェブサイト(https://www.python.org/downloads/)にアクセスしてダウンロードする必要があります。
また、システム環境変数設定もお忘れなく。
環境構築を簡単に説明すると
まず、サイトにアクセスした上でpythonをインストールしていただきます。その後、環境変数を設定して頂いて、コマンドラインにてpyhton –versionと叩くと、pythonのインストールバージョンが表示されれば成功です。
その後は、pythonを頭につけて命令文を打ち込むだけでpythonを用いた解析処理が可能になります。

OpenCVライブラリ

pythonの基本的なプログラミング知識

pythonのインストールと環境変数の設定が完了したら、cmdで以下のコマンドを実行します。
openCVライブラリをインストールする

pip install opencv-python

OpenCVを使用するためには,まずライブラリをインポートし,さらにnumpyをインポートしてnumpyの関数を使用する必要があります。

import cv2
import numpy as np

1. 画像を読み込んで、その画像の出力を表示する

#コード
image = cv2.imread(r “C:/scripts/kings.png”, cv2.IMREAD_GRAYSCALE)
cv2.imshow(“image”, image)
cv2.waitKey()
cv2.destroyAllWindows()
#画像を読み込むには,次のようにします.
cv2.imread(r “C:/scripts/kings.png”, cv2.IMREAD_GRAYSCALE)

第1引数には,ファイルのパス/ファイル名を渡します.
パスについて初めて聴く方向けに解説しますが、パスは特定のファイルまでたどり着くための道標みたいなものです。例えば、みなさんのPCにデスクトップ(DeskTop)がありますよね。そのデスクトップにapple.pngというファイルを置くとします。その時のapple.pngのパスはDeskTop/apple.pngとなります。というようにPCがそのファイルを参照するにはどういう道のりを辿ればいいのかをパスとして教えてあげているということですね。
画像が別のディレクトリにある場合は,画像のフルパスを渡す必要があります.
同じディレクトリ(実行中のディレクトリ)にある場合は、ダブルクォーテーションの下にファイル名を渡すだけで問題ありません。これは相対パスか絶対パスかという考え方なので煩わしい時には絶対パス(フルパス)のみを使用することを推奨します。
NOTE:パスの前にrというプレフィックスをつける必要があります。
例:r “C:/scripts/king.png”
第2引数では、例えば、カラースケール画像をグレースケール形式で読みたい場合、imread関数にフラグを設定する必要があります。
OpenCVには数多くのフラグが用意されていますが,最も一般的なものをいくつか挙げます.
1 cv2.IMREAD_COLOR (これの代わりに,1を指定することもできます).
2 cv2.IMREAD_GRAYSCALE (このフラグの代わりに,0を指定することもできます).
3 cv2.IMREAD_ANYCOLOR (これの代わりに,4を渡すこともできます)
4 cv2.IMREAD_ANYDEPTH (これの代わりに,2を渡すことができます)
より多くの IMREAD インスタンスを得るためには,cv2.IMREAD_ と書けば,残りの作業は IDE(統合開発環境)が行います.
リスト内包やvars()を利用することもできます。

imread = [i for i in vars(cv2) if “IMREAD” in i].
#出力
print(imread)
[‘imread_anycolor’, ‘imread_anydepth’, ‘imread_color’, ‘imread_grayscale’, ‘imread_ignore_orientation’, ‘imread_load_gdal’, ‘imread_reduced_color_2’, ‘imread_reduced_color_4’, ‘imread_reduced_color_8’, ‘imread_reduced_grayscale_2’, ‘imread_reduced_grayscale_4’, ‘imread_reduced_grayscale_8’, ‘imread_unchanged’].
cv2.imshow(“image”, image)

cv2.imshow(“image”, image) メソッドは,画像の出力を表示する GUI ウィンドウを作成するためのものです.GUIウィンドウとは皆様が検索エンジンなどを開くときにパッと出てくるアプリケーションみたいなものです。
第1引数には,GUIウィンドウの名前を指定します.第2引数には,画像が格納されている変数を指定します.
cv2.waitKey()
このメソッドは,ユーザがウィンドウを閉じるための入力をするまで,ウィンドウを画面上に保持するためのものです.
引数に何も与えなければ,キーを押すか,閉じるアイコンをクリックすることで,ウィンドウを閉じることができます.
何秒か何分かの間だけウィンドウを表示させたい場合は、ウェイトメソッドに5000のような整数データ型で時間を指定することができます。
また,ウィンドウを閉じるためのキーを指定することもできますが,そのためには以下のようにします.

if cv2.waitKey(1) == ord(“q”):
cv2.destroyAllWindows()
cv2.destroyAllWindows()

このメソッドは,GUI ウィンドウを破棄するためのものです.必ずコードの最後に使うようにしてください。このスクリプトを書き込まないとウィンドがいつまで経っても閉じられなくなるのでご注意ください。もし、そうなった場合コマンドラインにてctrl+Cで抜け出せます。

2. 画像をシステムに保存/書き込みする

#次のコードを入力します。
cv2.imwrite(“filename.png”, image)

第1引数には,画像の拡張子を持つファイル名を与えます.拡張子には,次のようなものがあります.
・jpg
・png
・jpeg
・tiff
画像を別の場所に保存するためにフルパスを指定することもできますが、その場合はrという接頭辞を付けなければなりません。

画像を別の場所に保存するためにフルパスを指定することもできますが、その場合はrのプレフィックスを追加する必要があります。プレフィックスはどこまでの情報を読み取るのかを設定ためのものです。
例:r “C:/scripts/filename.png”
第2引数には、システムに保存したい画像(画像の変数)を指定します。

3. 動画を読む

#cam を使うか,ビデオを読むか
cam = cv2.VideoCapture(0)
while True:
ret, frame = cam.read() #cam のレスポンス/フィードを読み込みます。
cv2.imshow(“F”,frame)
if cv2.waitKey(1) == ord(“q”):
break
cam.release() #カメラを解放します.
cv2.destroyAllWindows()

このコードを理解しましょう。
1行目で cam = cv2.VideoCapture(0) を使っています. cv2.videoCapture() メソッドは,システムカメラを使ってカメラのフィードを読むためのものです.cv2.videoCapture()メソッドは,システムカメラを使ってカメラフィードを読み取るためのものです.VideoCaptureメソッドでは,カメラのインデックスを渡す必要があります.内蔵の Web カメラがある場合は,引数として 0 を渡す必要があります.複数のカメラが接続されている場合は、1、2などの他のインデックスを渡す必要があります。システムメモリからビデオを読み取る場合は、ファイルのパスを指定し、プレフィックスとしてrを含める必要があります。例: cam = VideoCapture(r “C:/scripts/kings.mp4”)
2行目では、カメラの映像を継続的に読み込めるように、Whileループを使います。
3行目のWhileループの下で、ret, frame = cam.read()を使ってカメラのフィードを読み取ると、2つの値が返されます。1つ目の値は,フィードが実行されているかどうかを確認するためのもので(それ以外の場合は True,読み込むフィードがない場合は False を返します),2つ目の値は,フレームのピクセルマトリックスです.
4行目では, cv2.imshow(“F”, frame) で,フレーム出力を GUI ウィンドウに表示します.
5行目、6行目では

if cv2.waitKey(1) == ord(“q”):
break

ループは,waitkey が “q” の入力を検出するまで実行し続けます.”q”キーが押されると、ループは実行を停止し、カメラ映像の使用を停止します。
7行目(重要)では、cam.release()を使います。このメソッドは、カメラの結合を解除し、他のアプリケーションがカメラを使用できるようにカメラを解放します。
8行目では,cv2.destroyAllWindows() メソッドを用いて,GUI のウィンドウを閉じることができます.

4. 色空間を別のものに変換する

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow(“Image”,image)
cv2.waitKey()
cv2.destroyAllWindows()

このコードを理解しましょう。
色のチャンネルを変換するために,cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) を利用します.
第1引数には,変換したい画像行列を渡し,目的のカラーチャンネルを得るためには,このメソッドの第2引数にカラーコードを渡す必要があります.
カラーコードには,以下のようなものがあります.
1. cv2.COLOR_BGR2GRAY
2. cv2.COLOR_BGR2RGB
3. cv2.COLOR_BGR2HSV
cv2.COLOR_ と入力することで,より多くのカラーコードを確認することができ,残りの作業は IDE のインテリセンス機能によって処理されます.
リスト内包と vars() を使って、すべてのカラーコードを取得することもできます。

colors = [i for i in vars(cv2) if “COLOR_BAYER” in i].
#出力
print(colors)
[‘COLOR_BAYER_BG2BGR’, ‘COLOR_BAYER_BG2BGRA’, ‘COLOR_BAYER_BG2BGR_EA’, ‘COLOR_BAYER_BG2BGR_VNG’, ‘COLOR_BAYER_BG2GRAY’, ‘COLOR_BAYER_BG2RGB’, ‘COLOR_BAYER_BG2RGBA’, ‘COLOR_BAYER_BG2RGB_EA’, ‘COLOR_BAYER_BG2RGB_VNG’, ‘COLOR_BAYER_GB2BGR’, ‘COLOR_BAYER_GB2BGRA’, ‘COLOR_BAYER_GB2BGR_EA’, ‘COLOR_BAYER_GB2BGR_VNG’, ‘COLOR_BAYER_GB2GRAY’, ‘COLOR_BAYER_GB2RGB’, ‘COLOR_BAYER_GB2RGBA’, ‘COLOR_BAYER_GB2RGB_EA’, ‘COLOR_BAYER_GB2RGB_VNG’, ‘COLOR_BAYER_GR2BGR’, ‘COLOR_BAYER_GR2BGRA’, ‘COLOR_BAYER_GR2BGR_EA’, ‘COLOR_BAYER_GR2BGR_VNG’, ‘COLOR_BAYER_GR2GRAY’, ‘COLOR_BAYER_GR2RGB’, ‘COLOR_BAYER_GR2RGBA’, ‘COLOR_BAYER_GR2RGB_EA’, ‘COLOR_BAYER_GR2RGB_VNG’, ‘COLOR_BAYER_RG2BGR’, ‘COLOR_BAYER_RG2BGRA’, ‘COLOR_BAYER_RG2BGR_EA’, ‘COLOR_BAYER_RG2BGR_VNG’, ‘COLOR_BAYER_RG2GRAY’, ‘COLOR_BAYER_RG2RGB’, ‘COLOR_BAYER_RG2RGBA’, ‘COLOR_BAYER_RG2RGB_EA’, ‘COLOR_BAYER_RG2RGB_VNG’]

などがあります。

いかがでしたでしょうか。今回の記事は少し初歩的なものに焦点を当てて皆様にご紹介させていただきましたが、もう少しハイレベルなものを求める方は過去の記事をご覧ください。今後、ハイレベル、諸学者向けのニーズに満遍なく答えれるよう邁進していきますのでよろしくお願い致します。次回の記事はこちらです。