かみのメモ

コンピュータビジョン・プログラムな話題中心の勉強メモ(記事一覧は https://kamino.hatenablog.com/archive へ)

OpenCVに入門するならまず公式のサンプルコードを動かしてみよう

以前のWindowsでOpenCVとopencv_contribをビルド&インストールするに引き続きOpenCVネタです。

この記事では、OpenCVの公式サンプルコードを実行する方法を紹介します。

あまり他の記事で紹介されているところを見ないのですが、OpenCVの公式リポジトリには大量のサンプルコードが用意されています。 このサンプル集はデモを見るだけでもなかなか勉強になりますし、実装もきれいなのでアプリ開発をするときの参考にもなります。

特に「OpenCVで何ができるの?」「この処理はどう書いたらいいの?」という入門者の方にはぜひ試してもらいたい内容です。

OpenCVの公式サンプル集

サンプル集へのリンクがこちら↓です。

github.com

見てのとおりC++JavaPython向けのサンプルから、android、DNN、OpenGLなど特定のプラットフォーム向けのサンプルまで、様々なサンプルコードが含まれています。

この記事では環境構築と実行が簡単なPythonのサンプルコードの実行方法を紹介していきます。

インストールしておくもの

  • Python
    • 一応Python 2でも動くらしいですが、Python3を使うのが無難だと思います
    • 筆者の環境は3.7.0
  • Git

OpenCVライブラリのインストール

Pythonのパッケージマネージャーpipを使います。 いくつかのサンプルはOpenCVの外部モジュールであるopencv-contribを利用するのでそちらも一緒にインストールしておきます。

python -m pip install opencv-python opencv-contrib-python

サンプルのダウンロード

サンプルコードやサンプル画像を取得するためにOpenCVリポジトリを丸ごとクローンします。 適当なディレクトリを作ってターミナル(WindowsならGitをインストールしたときに付いてくるGit BashでOK)を開き、次のコマンドを実行しましょう。

git clone https://github.com/opencv/opencv.git

サンプルを実行してみる

クローンしたリポジトリopencv/samples/pythonに大量のpythonファイルが入っていると思います。 その中の1つのdemo.pyを実行します。

cd opencv/samples/python
python demo.py

もしWindows'C:\Program' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。のようなエラーが出たら一旦画面を閉じて、demo.pyの170行目あたりのPopen(sys.executable + ' ' + cmd, shell=True)Popen('"' + sys.executable + '" ' + cmd, shell=True)に変更してもう一度実行してみてください。

すると次のような画面が出てきて、サンプルコードの一覧が表示されます。

f:id:kamino-dev:20180904180746p:plain

あとは選択して実行するだけでサンプルのデモを見ることができます。

とりあえずbrowseを選択してRunボタンを押してみましょう。 するとサンプルbrowse.pyが起動します。

f:id:kamino-dev:20180904181700p:plain

マウスカーソルを当てた場所が拡大して表示される、というだけの簡単なプログラムですが、きちんと動いていることが確認できると思います。 プログラムを終了するときはESCキーを押します。

ついでにもう一つ、今度はdeconvolutionを実行してみましょう。

f:id:kamino-dev:20180904182628p:plain

今度はもう少し実践的なデモです。

左の手ブレ写真にdeconvolution(畳み込み演算の逆の処理)を施すことで手ブレによるノイズを除去し、右のような画像を復元してくれるアプリケーションです。 右上のスライダーを動かしてカーネルのパラメータを調節できるようになっています。


以上、OpenCVの公式サンプルの実行方法を簡単に説明しました。

この他にもカメラキャリブレーションcalibrate)、Canny法によるエッジ検出(edge)、顔認識(facedetect)、Webカメラで物体追跡(camshift)など色々なサンプルがあるので、自分でプログラムを書くときの参考にしてみてください。

(時間ができたら全サンプルの解説記事とか書いてみたいなぁ)