03-3258-1238
03-3258-1238平日9:00 ~ 18:00(土日祝日除く)
本記事では、画像処理に欠かせない「OpenCV」について、機能や基本的な使い方について 解説します。
OpenCVは、インテルのエンジニアが開発した、無料で配布されている画像処理・画像解析のためのライブラリです。
ライブラリは、プログラムに詳しい人が難しい機能のプログラムを作成してパッキングしたもので、プログラムに詳しくない人でも、そのライブラリを使用することによりすごいことが出来ます。
例えば、「顔検出」です。1からプログラムを作成して顔検出を実現するのはかなり大変ですが、OpenCVのライブラリを使用すれば、初心者の方が十数行のプログラムを書くことで実現出来ます。
→PythonとOpenCVで簡単にできる顔検出
画像処理・画像解析といってもいろいろな内容が含まれます。 代表的なところでは、「顔検出」、「文字認識」、「画像のパターンマッチング」などがありますが、これらを実現するためにライブラリとして存在する機能一覧を紹介します。
カメラからの画像をプログラムに取り込んだり、処理した画像をPCの画面やファイルとして出力するためのコマンドが用意されています。
”BMP","JPEG","PNG","PBM"など主要なフォーマットに対応しています。
どのような解像度、フレームレート、カメラの設定(明るさ、コントラストなど)で取り込むかという設定の確認・変更などもコマンドで実行することが可能です。
より詳しく、OpenCVを用いたUSBカメラからの画像の取り込みに関して解説します。
→カメラから画像を取得するコマンドcv2.readとは
オブジェクト検出などの精度をあげたり高速化したりするための前処理として以下のような「画像を加工」するコマンドが用意されています。
例えば、顔検出では、検出の処理を高速化するために、事前にカラーで取得した画像をグレースケール化して情報量をすくなくするなどの工夫を行います。
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
”cv2.cvColor”がOpenCVが用意している色情報を変換するコマンド、"img"は入力画像、"cv2.COLOR_BGR2GRAY"はどのような処理をするかの設定です。 cv2.COLOR_BGR2GRAYは、「BGR(青、緑、赤)の順番で格納されているカラー画像をGRAY(グレースケール)に変換」を意味しており、OpenCVのcv2.readコマンドで読み込んだ画像は通常BGRの順番で格納されているので、この設定が使われます。(他の方法で読み込んで色情報の順番が異なる場合は、cv2.COLOR_RGB2GRAYなどを使用します。)
以下のように、ある条件に合致したオブジェクトを検出するコマンドが用意されています。
コーナー検出や特徴点検出は、検出した結果を何かに使うという場合が多いと思いますが、検出するところまでを1つのコマンドで実行できるのは非常に便利です。 また、顔検出や目検出に関しては、コマンドを実行すると、左下座標と幅、高さが数値データとして得られます。
face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
[[ 70 92 169 169]]
↑ 1:顔の左下座標のx 2:顔の左下座標のy 3:顔の高さh 4:顔の幅w
様々な情報を追加するために、枠の描画や、文字挿入のコマンドが用意されています。描画できるものには、以下のようなものがあります。
例えば、顔検出したあとに、元の画像の顔の箇所に枠を追加することが可能です。
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
Deep Learningは、教師データ(正解データ)を機械に与えて学習モデルを作成すると、その学習モデルを使って分類や回帰(定量値の算出)ができるようになるという優れた技術です。 例えば、手書きの文字や動物、食べ物、造形物の写真の画像を教師データとして用いて学習させると、その後、画像からそれらの対象を抜き出したり、判別したりすることができるようになります。
OpenCVには、教師データとして”正解データ”のDBを作成するコマンドやその後、そのデータを学習させるコマンドが用意されています。
他にも以下のような処理が可能です。
キャリブレーションパターンを写した写真からカメラのパラメータを求めることができる
異なるダイナミックレンジの写真を組み合わせて、白飛びのない写真を作ることができる
機能的にはかなりの充実度と完成度を併せ持ったライブラリですが、有志による無償のオープンソースプログラムですので、以下のような点が弱点としてよく挙げられます。
■公式のドキュメントだけではよくわからないことがある。 各コマンドの引数などは、本やGoogle検索で調べる必要があります。
■行列の計算が苦手 行列に関しては、別ライブラリのNumpyを組み合わせて使用されている方が多いようです。
OpenCVは、多くの環境で使えることもメリットの一つです。サポートOSとプログラム言語の観点で見ていきます。
OpenCVはマルチプラットフォーム対応なのでほとんどのOS上で問題なく動作します。産業用でも使われるようになったラズベリーパイもLinux系のOSなので問題なくOpenCVを使用できます。
OpenCVを使用できる言語は、バージョンによって異なりますが、公式にサポートされているのは以下の言語になります。
公式サポート外ですが、実際には、C#、Lua、PHP、Ruby、Goなどでも動作するようです。
Pythonをインストールしていないという方は、まずは以下を参照してPythonをインストールしてください。
→Pythonのインストール(バージョンの選び方)
Windowsであればコマンドプロンプト上、LinuxやMacOSであればTerminal上で、以下のpipコマンドを実行すれば、OpenCVをインストールできます。
pip install opencv-python
プログラムコードの初めにOpenCVのライブラリを読み込むための宣言を追加します。
import cv2
この宣言により、プログラムでOpenCVを使用するということをプログラムが認識し、プログラム内部でOpenCVのコマンドを使用した際に、OpenCVのライブラリ内に記述されたプログラムが実行されます。
OpenCVの公式ドキュメントのOpenCV-Python Tutorialsを確認するとやりたいことからコマンドを探すことができます。
例えば、しきい値処理をしたい場合には、Tutorialsから"Image Processing in OpenCV" -> "Image Thresholding"を順番に選択するとしきい値処理のコマンドの詳細(コマンドやその引数の意味)を確認できます。
cv.threshold(src, thresh, maxval, type)
上記のcv.thresholdの後ろにある()内のsrc, thresh, maxval, typeが引数です。 引数は、OpenCVのライブラリに引き渡すパラメータで、これらの値によってOpenCVの動作が変わります。
引数の更なる詳細は、以下のような方法で確認していく必要があります。
一部のコマンドの詳細に関しては、本サイトの他のコンテンツでも説明していくので参考にしていただけると幸いです。
今回、OpenCVについて、何ができるのか、どうやって使用するのかを紹介しました。 OpenCVは画像処理・画像解析の優れたライブラリで、色々は処理を多くのプラットフォームで実行することが可能です。 ですが一方で、ライブラリには、自由度が少ない、仕様がわからないと使いにくいという側面もあります。しかも、実際に使用するには複数のコマンドを組み合わせて使用するので、より複雑になります。 1つ1つのコマンドの意味、引数の意味を理解して正しく設定していくことが必要になります。
v4l2でカメラパラメータを確認
初めてのPythonガイド
初めてのOpenCVガイド
カメラの設定の確認・変更
カメラの設定Windowを簡単に出す
フレームレートの設定・確認方法
USBケーブルの延長方法
ハイスピードカメラとは
USBカメラの「ゲイン」設定
産業用カメラの選び方
KLV大学マシンビジョンコース