SSブログ

画像処理・認識 [画像のロード] [OpenCV]

「HighGUI」技術

画像をディスクからロードする

◆ 画像ファイルを読み込む関数

OpenCV 関数名 書式、コメント
1.x系 cvLoadImage IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR )
2.x系 cv::LoadImage IplImage* cv::LoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR )
  cv::LoadImageM LoadImageM(filename, iscolor=CV_LOAD_IMAGE_COLOR)
ファイルから,CvMatとして画像を読み込む。

読み込む画像のカラーの種類

  • CV_LOAD_IMAGE_COLOR 画像は,強制的に3チャンネルカラー画像として読み込む
  • CV_LOAD_IMAGE_GRAYSCALE 画像は,強制的にグレースケール画像として読み込む
  • CV_LOAD_IMAGE_UNCHANGED 画像は,そのままの画像として読み込む

ファイルフォーマット

  • Windows bitmaps - BMP, DIB
  • JPEG files - JPEG, JPG, JPE
  • Portable Network Graphics – PNG
  • Portable image format - PBM, PGM, PPM
  • Sun rasters - SR, RAS
  • TIFF files - TIFF, TIF
読み込む画像がカラー/グレースケールのどちらか,とデプスを指定する. カラー/グレースケールの指定は,読み込まれた画像を 3 チャンネル(CV_LOAD_IMAGE_COLOR)に変換するか, 1チャンネル(CV_LOAD_IMAGE_GRAYSCALE)に変換するか,あるいは入力画像(CV_LOAD_IMAGE_ANYCOLOR)のままにしておくかを決める.
デプスの指定は,読み込まれた画像を,以前のバージョンの OpenCV で行われたように一つのカラーチャンネルに対して 8ビットに変換するか,入力画像のままにしておくかを決める.CV_LOAD_IMAGE_ANYDEPTH が渡された場合に取りうるピクセルフォーマットは, 8 ビット符号無し整数,16 ビット符号無し整数,32 ビット符号付き整数,32 ビット浮動小数点数である.
渡されたフラグが衝突する場合,小さい値を持つフラグが優先される. 例えば, CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR というフラグの場合は, 画像は 3 チャンネルとして読み込まれる. CV_LOAD_IMAGE_ANYCOLOR は,CV_LOAD_IMAGE_UNCHANGED と等価であるが, CV_LOAD_IMAGE_ANYCOLOR には,CV_LOAD_IMAGE_ANYDEPTH と併用できるという利点がある. よって,CV_LOAD_IMAGE_UNCHANGEDは今後利用すべきではない.
出来る限り忠実に画像を読み込みたい場合は, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR を指定する。

[opencv.jp document より引用]

 

◆ 画像ファイルを書き込む関数

OpenCV 関数名 書式、コメント
1.x系 cvSaveImage int cvSaveImage( const char* filename, const CvArr* image )
2.x系 cv::SaveImage SaveImage(filename, image)
関数 cvSaveImage は,画像を指定したファイルに保存する. 画像フォーマットは,filename の拡張子により決定される(cvLoadImage を参照). この関数で保存できるのは,8 ビット 1チャンネル,あるいは 8 ビット3 チャンネル('BGR' の順)画像だけである. フォーマットやデプス,チャンネルの順序などが異なる場合は,保存する前に cvCvtScale と cvCvtColor を使って画像を変換するか,あるいは汎用的な関数 cvSave を利用して XML/YAML フォーマットで保存すること。

[opencv.jp document より引用]

 

本記事は以下の参考書を元に書いています。


画像処理・認識 [ウィンドウ] [OpenCV]

「HighGUI」技術

ウィンドウ関連の関数群について

◆ スクリーンに画像を表示する関数

OpenCV 関数名 書式
1.x系 cvNamedWindow int cvNamedWindow( const char* name, int flags=CV_WINDOW_AUTOSIZE )
2.x系 cv::namedWindow void namedWindow(const string& winname, int flags)

◆ ウィンドウハンドルの取得

OpenCV 関数名 書式
1.x系 cvGetWindowHandle void* cvGetWindowHandle( const char* name )
2.x系 cv::GetWindowHandle void* cv::GetWindowHandle(const char* name)

◆ ウィンドウ名を取得

OpenCV 関数名 書式
1.x系 cvGetWindowName const char* cvGetWindowName( void* window_handle )
2.x系 cv::GetWindowName const char* cvGetWindowName(void* windowHandle)

◆ ウィンドウのリサイズ

OpenCV 関数名 書式
1.x系 cvResizeWindow void cvResizeWindow( const char* name, int width, int height )
2.x系 cv::ResizeWindow void cv::ResizeWindow(const char* name, int width, int height)

 

本記事は以下の参考書を元に書いています。


画像処理・認識 [ツールキット] [OpenCV]

「HighGUI」技術

HighGUI (High-level Graphical User Interface) とはOS、ファイルシステム、ハードウェア(カメラ等)とやるとりするライブラリ。ウィンドウを開く、画像を表示する、グラフィック関連ファイルの読書き、さらにマウス、ポインタ、キーボード等のイベント処理を行うことができる。

このライブラリは大きく3つの部分に分けることができる。

① ハードウェア部

主にカメラの操作に関連している。

② ファイルシステム部

主に画像のロードと保存に関連している。

③ ウィンドウシステム部

ウィンドウ関係に関連しており、ウィンドウにかかわるイベント等の処理も行うことができる。

 

本記事は以下の参考書を元に書いています。


カメラ動画データ1フレームをOpenCV Mat配列にコピーするのに要する時間 [OpenCV]

カメラから画像1フレーム分のデータを取得しWindowに表示するまでの時間を、下記の条件で計測した。

計測条件

◆カメラ仕様

  • 解像度: 2592 pixels × 1944 pixels
  • フレームレート: 14 fps
  • モノクロ
  • インターフェース: USB 3.0

◆PC仕様

  • プロセッサ: Intel Core i7-3930K CPU 3.20GHz
  • RAM: 16.0GB
  • OS: Windows 7 Professional

◆開発環境

  • 環境: Visual Studio 2010 Professional
  • 言語: C/C++

◆計測仕様

  1. カメラメーカ提供のライブラリを利用しWindowを表示するまでを計測(デフォルト)
  2. OpenCVで利用するMat形式の変換処理を加えて計測。
  3. 2項に加えWindow作成をメーカ製からOpenCV用(C++関数)に変更して計測。

 

計測方法

プロジェクト形式は、C/C++コンソールアプリケーションとし、時間計測は以下の関数を利用して計測。

  • QueryPerformanceFrequency(&frequency)
  • QueryPerformanceCounter(&start_time)
  • QueryPerformanceCounter(&end_time)

 

結果

計測を10回行い平均値、最大値、最小値を求めた。(単位:秒)

計測条件No 平均 最大 最小
1 0.079 0.222 0.002
2 0.268 0.403 0.223
3 0.314 0.297 0.284

 

考察

OpenCV用データ形式への変換処理は大きな配列のコピーとなるため、その処理に多大な時間がかかっている。これは許容できない値であり、何らかの対応が必要となる。

例えば配列の高速コピーを行う方法、コピーしないでOpenCVを利用する方法、それにカメラ側データ処理についての調査等を行う必要がある。

 

参考サイト

時間計測

OpenCVデータ


OpenCV 書籍調査(レビューのまとめ) [OpenCV]

詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識

表紙 image
著者 Gary Bradski著
出版社 オライリージャパン
発売日 2009/8/24
価格 4,830
レビュー

OpenCVの様々な構造体や関数を詳細に解説しているのでコーディングのリファレンスとして使えるのはもちろんですが、それだけならずコンピュータビジョンの最新の知見や応用に関しても述べているのでコンピュータビジョンの参考書としても読むことができます。

チュートリアルとしても、リファレンスとしても、使えます。価格が高く感じる方もいると思いますが、この情報量を考えると安いくらいだと思います。

OpenCVのウェブのリファレンスだけでは足りないという方にオススメです。

OpenCVを使用したソフトを作成していますが、辞書代わりに使用する頻度が高いです。関数によっては詳細な説明がなされています。サンプルコードつき。

細かい関数リファレンスというより、最初にOpenCVのライブラリ構成や基礎となっているアルゴリズムの解説に重点が置かれている本。一通り説明されているので、OpenCVで何ができるかを知るには非常に便利。
これから画像解析でOpenCVの世界に飛び込もうという方へ最初の1冊としてはよい。

OpenCVの参考書というよりも、画像処理の中級書といった方が正しいかもしれません。高度な内容まで網羅されているので、画像処理をやるなら、手元に一冊置いておいて絶対損はありませんよ!

慣れてきた人がより詳しく使いこなすために必要ならばおすすめ。

 

OpenCV プログラミングブック 第2版 OpenCV 1.1対応

表紙 image
著者 奈良先端科学技術大学院大学
出版社 毎日コミュニケーションズ
発売日 2007/9/22
価格 -
レビュー

ここに載っているサンプルプログラムは、ほぼ各行にコメントが追加されていてまた、別枠で関数ごとの引数の説明とサンプルが書いてますから、「この部分を2台のカメラにしたいな」と思ったら直感的に変更する事が出来ました。と言うか、私が出来るのは、まだこの程度なんですが、そんな私でも、難しいことをせずにカメラ画像や動画を呼び出したり加工したり出来るのは驚きです。

入門書の様に解りやすいかと思えば、難しい公式が出てきて、難解な部分も多く、全体的なバランスとしては、あまり良くないかも知れません。(入門者からは少し敷居が高く、上級者からは物足りないかも?)

『詳解…』と同じくバイブル的存在ですが,こちらを最初に読むことをお薦めします

OpenCVを1から始めるのなら、一番わかり易い参考書は本書でしょう。画像処理の基礎的なアルゴリズムをOpenCVで実装している例が多数掲載されているため、画像処理の勉強にも最適です。

 

OpenCV 2 プログラミングブック OpenCV 2.2/2.3対応

表紙 image
著者 OpenCV 2 プログラミングブック制作チーム
出版社 マイナビ
発売日 2011/12/27
価格 3,570
レビュー

本書ではOpenCV 2系の導入と開発環境の構築、実行までを分かりやすく解説。
また「リファレンス編」では必須アルゴリズムの基本的な使い方を数多く取り上げ、「ケーススタディ編」ではOpenCV 2の活用例として理論・モデルの実装を紹介します。

新しく興味をもっている方が入門として買うならばおすすめ。

 

実践OpenCV—映像処理&解析

表紙 image
著者 永田 雅人
出版社 カットシステム
発売日 2013/01
価格 3,990
レビュー この本は初心者にお勧めです。静止画・動画を網羅。Visual C++の MFC でOpenCVのプラグラムを動作させる記述が書かれている珍しい本です。
サンプルプログラムなどはすべてC言語APIを使用されています。

 

OpenCVで始める簡単動画プログラミング

表紙 image
著者 北山 洋幸
出版社 カットシステム
発売日 2013/07
価格 3,360
レビュー Webカメラを用いたキャプチャ、動画像処理プログラミングを中心とした本です。
OpenCVのhighguiを用いることで、迅速で簡易なアプリケーション作成を行っています。
他の参考書と比較しても内容は易しく、サンプルコードも豊富にある。

まず、OpenCVを使う前に前提知識としてC++をある程度しっている必要があります。
また、全体の説明はしっかりしているのですが細部の説明がちょっと荒い気がします。

プログラムをある程度やっていて、動画もやろう、という方ならいいと思いますが、この本からプログラムに入ろうという方はちょっと考えた方がいいです。

内容としては、動画プログラミングの基礎的な内容は多く入っていると思います。

簡単に書いてあるのですが,この本だけだと前には進めません。また動画がメインなので静止画の扱いもいまいちです。

簡単に動画の処理を行う!というのがコンセプトです。
OpenCVでカメラの制御を行うのは、かなり厳しいのですが、厳しいなりの工夫を紹介しています。
また、最後に紹介している立体表示という部分はちょっと面白かったです。まさにアイディア勝負という感じ。

 

OpenCV 2 Computer Vision Application Programming Cookbook

表紙 image
著者 Robert Laganiere
出版社 Packt Publishing
発売日 2011/5/30
価格 4,483
レビュー

OpenCV 2.x系から、CスタイルのAPIに加えて、C++スタイルのAPIが使えるようになった。この本の中のコードは、すべてC++のAPIを使って書かれている。

QtというUI Frameworkと組み合わせて使う方法についても書かれているので、OpenCVのHighGUIではちょっと機能が足りないな、と感じている人にとっても参考になる。

また、メモリ管理周りや、効率の良いデータアクセスの方法など、実践的なことについて書かれているので、いろいろと参考になると思う。英語版だけど、簡潔な英語で書かれているので、割と読みやすい方だと思う。

 

そして本屋で内容を確認し「詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・/オライリージャパン 」を買いました。

これからは、この本の内容について記事を作成していくのでよろしくお願いします。

 

参考サイト(参考とさせていただいたサイトの運営者様には感謝いたします)


OpenCVとは [OpenCV]

◆特徴

  • オープンソース
  • インテルが開発・公開
  • 現在はWillow Garageが開発

◆長所

  • 簡単
  • 移植性が高い
  • 無料(BSDライセンス)

◆短所

  • 具体的な機能は自分で実装しなければならない
  • SHIFTやSURFといったアルゴリズムは特許がとられている
  • 権利関係に注意(落とし穴あり)

◆画像処理とは

数学的な処理による画像の変換

  • 2値化
  • 明るさの調整
  • コントラストの調整
  • 色成分の抽出
  • 色反転
  • 拡大縮小
  • グレースケール化
  • 切り出し
  • ぼかし
  • ガンマ補正
  • 任意角回転
  • 鏡像反転
  • ノイズ除去
  • セピア調化
  • 輪郭抽出
  • 増殖

◆画像認識とは

コンピュータに視覚を持たせる

  • 物体認識(HOG特徴量)
  • 顔認識(バイオメトリクス)
  • 画像理解(2次元画像から3次元に復元)
  • 拡張現実(AR)
  • Kinect
  • アニメ顔検出
  • Oppai-Detect3

◆OpenCVの基本機能

  • 行列構造
  • 算術・線形代数演算
  • 離散フーリエ変換
  • XML/YAML入出力
  • etc

◆OpenCVの画像処理

  • フィルタ
  • ガウシアンブラー
  • 収縮・膨張
  • リサイズ
  • リマップ
  • 色変換
  • ヒストグラム計算
  • etc

◆OpenCVの統計的機械学習モデル

  • Support vector machine(SVM)
  • 決定木
  • ブースティング

◆2次元特徴検出

  • SHIFT
  • SURF
  • FAST

◆モーション解析・オブジェクトトラッキング

  • オプティカルフロー
  • モーションテンプレート
  • 背景差分法

◆画像からのオブジェクト検出

  • Haar & LBP 顔検出
  • HOG物体検出

◆情報サイト

以上

参考サイト


OpenCVをC#で使う(OpenCvSharpインストール編) [OpenCV]

OpenCVの対応言語はC/C++、Java、Pythonだけであり、.Netには対応してない。しかしWeb上には.NET(C#)で使うためのラッパーがいくつか存在する。Webで調べたところでは、Emgu CV、OpenCVDotNet、OpenCvSharpの3つを見つけた。

今回、OpenCvSharpを利用することにした。理由は2つある。1つ目の理由は、Emgu CVとOpenCVDotNetの2つはGPLライセンスであること、2つ目の理由はOpenCvSharpの開発者が日本人でありドキュメントが揃っている事である。

1.インストール

以下のサイトから、それぞれの最新版である本体、サンプルおよびマニュアルをダウンロードする。

  • OpenCvSharp-2.4.5-x64-20131009.zip
  • Sample-2.4.5-20130711.zip
  • Documentation-Jp-2.1-20100508.chm / Documentation-Jp-2.1-20100508.zip

https://code.google.com/p/opencvsharp/downloads/list

image

また詳細は以下の作者のページを参考とします。http://schima.hatenablog.com/entries/2009/06/16#1245081217

インストール作業は特に内容です。ただしVisual C++ 再領布可能パッケージのインストールが必要です。以下の中から自分の環境に合わせてインストールします。

x86
Visual C++ 2010 Redistributable Package (x86)
Visual C++ 2008 SP1 Redistributable Package (x86)
Visual C++ 2005 SP1 Redistributable Package (x86)

x64
Visual C++ 2010 Redistributable Package (x64)
Visual C++ 2008 SP1 Redistributable Package (x64)
Visual C++ 2005 SP1 Redistributable Package (x64)

2.使い方

① Visual Studioのプロジェクトを作成する。

ファイルをすべてプロジェクトにいれる。ファイルを選択しソリューションエクスプローラにドラッグ&ドロップします。

image

② OpenCvSharpExtension.dllのコピー設定

ソリューションエクスプローラから””を選択し、プロパティから「出力ディレクトリにコピーする」を「新しい場合はコピーする」に編集します。

image

③ 参照設定

「ソリューションエクスプローラ」の「参照設定」を右クリックし「参照の追加」を選択する。

image

「参照の追加」のダイアログからすべてのOpenCvSharp関連のDLLを参照に追加します。

image

ただし、OpenCvSharpExtern.dllのみ参照設定しない。(できない)

image

3.動作確認

以下のコードを記述し実行する。

image

以下のエラーが出た場合

image

① OpenCVのDLLもソリューションエクスプローラに加える。

OpenCVのバージョンを合わせる必要がある。今回の場合、OpenCvSharpのバージョンが2.4.5 64bit版のためOpenCVも下記のサイトから2.4.5 64bit版を入手しDLLをソリューションエクスプローラに加える。

http://opencv.org/downloads.html

このアプリケーションの場合、3つのDLLをソリューションエクスプローラにに加え、すべての「出力ディレクトリにコピー」プロパティを「新しい場合はコピーする」に設定する。

注意点として、ビルドのプラットフォーム設定を「x64」と整合を取る必要があります。

image

OpenCV、OpenCvSharp、Visual C++ Redistributable Package のバージョンとプラットフォーム、さらにC#のビルドプラットフォームが同じになると正常にプログラムが起動します。

以下のウィンドウが出れば成功です。

image

以上で「OpenCvSharpインストール編」を終了します。

 

参考サイト


3. OpenCVを使って画像処理(アプリ開発編) [OpenCV]

サンプルコード

Webにあったコードを書いて実行してみた。

#include "opencv2\opencv.hpp"

int _tmain(int argc, _TCHAR* argv[])
{
    //画像データの読込
    IplImage* src_img = cvLoadImage("C:\\OpenCV2.4.6\\opencv\\samples\\cpp\\lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
    if (src_img == NULL){
        return 0;
    }
 
    //表示ウィンドウの作成
    cvNamedWindow("src");
    cvNamedWindow("dst");
 
    //処理後画像データの確保
    IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels);
 
    //画像処理例(ガウシアンフィルタ)
    cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9);
 
    //画像の表示
    cvShowImage ("src", src_img);
    cvShowImage ("dst", dst_img);
 
    //キー入力待ち
    cvWaitKey (0);
 
    //全てのウィンドウの削除
    cvDestroyAllWindows();
 
    //画像データの解放
    cvReleaseImage(&src_img);
    cvReleaseImage(&dst_img);

    return 0;
}

実行画面

ウインドウズ コンソールとオリジナル画像そしてガウシアンフィルタ後の画像が現れます。そして何かキーを押すと終了します。

image

簡単ですね。デバッグビルドNGで少し悩みましたけど、比較的簡単にここまでたどり着けました。次回はもう少しいろいろなサンプルを動かして動作を理解していくことにします。

 

参考サイト


2. OpenCVを使って画像処理(ライブラリ登録編) [OpenCV]

ライブラリの登録

OpenCVにかぎらず、ライブラリ(lib)の登録方法に幾つかのやりかたあることが判明したので記録しておく

1.プロパティに登録

一つ目は前回のインストール編で紹介したように、「プロジェクトのプロパティ」ダイアログから「構成プロパティ」「リンカー」「入力」を選択し、「追加の依存ファイル」にライブラリディレクトリ”C:\OpenCV2.4.6\opencv\build\x86\vc10\lib”内のライブラリすべてを登録する方法。

image

2.ソースコードに記述

二つ目は、ソースコード上に記述する方法。以下のように、Debug/Release版を分けて読み込む方法。

#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_calib3d246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_core246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_flann246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_ml246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_nonfree246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_ocl246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_photo246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_stitching246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_superres246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_ts246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_video246d.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_videostab246d.lib")
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_calib3d246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_core246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_flann246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engine.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_ml246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_nonfree246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_ocl246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_photo246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_stitching246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_superres246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_ts246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_video246.lib")
    #pragma comment(lib,"C:\\OpenCV2.4.6\\opencv\\build\\x86\\vc10\\lib\\opencv_videostab246.lib")
#endif

3.プロジェクトに登録

三つ目はVisual Studioのプロジェクトに登録する方法。

image

 

開発環境を選ばないことから二番目のソースコードに記述する方法が一般的かと思える。


OpenCVを使って画像処理(インストール編) [OpenCV]

ダウンロード

以下のサイトからWindows版を後、最新版をダウンロードする。現在の最新版は OpenCV-2.4.6.0.exe でした。

image

http://sourceforge.net/projects/opencvlibrary/files/

image

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/

インストール

ダウンロードしたOpenCV2.4.6.0.exeをクリックし起動する。

[…]ボタンを押してインストール先を指定し、「OK」ボタンを押すとインストールが開始される。それに先立ちインストールフォルダ「C:\OpenCV2.4.6」を作成しておくこと。

image

環境設定

この状態ではファイルが解凍されただけなので環境設定する。

スタートメニューから「コントロールパネル」、「システム」、「システムの詳細設定」と選択し「システムのプロパティ」を起動する。

image

ここで「詳細設定」田ぬ、「環境変数」ボタンを押し「環境変数」ダイアログを起動する。

image

システム環境変数のリストから「Path」を選択し「編集」ボタンを押す。

image

変数値に以下の2つの値を追加して「OK」ボタンを押す。

C:\OpenCV2.4.6\opencv\build\x86\vc10
C:\OpenCV2.4.6\opencv\build\x86\vc10\bin

コンパイルテスト

Visual Studio 2010から「Visual C++」「Windows フォームアプリケーション」プロジェクトを作成する。

“stdafx.h”に以下のコードを追加。

#include <opencv/cv.h>
#include <opencv/highgui.h>

プロジェクトのプロパティダイアログを起動する。

インクルードディレクトリの設定

「構成プロパティ」「VC++ディレクトリ」「インクロードディレクトリ」、「▼」ボタン、「編集」と選択し「インストールディレクトリ」ダイアログを起動する。

image

「フォルダ」アイコン、「…」ボタンと選択しディレクトリ選択ダイアログを起動する。

image

インクルードディレクトリ”C:\OpenCV2.4.6\opencv\build\include”、ライブラリディレクトリ”C:\OpenCV2.4.6\opencv\build\x86\vc10\lib”を設定する。

image

共通言語ランタイムサポートを(/clr)へ変更する。

image

この状態でビルドすると以下のような「未解決の外部シンボルエラー」が発生する。

error LNK2019: 未解決の外部シンボル _cvReleaseImage が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _cvWaitKey が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _cvShowImage が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _cvMoveWindow が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _cvNamedWindow が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _cvLoadImage が関数 _main で参照されました。

解決方法は、「プロジェクトのプロパティ」ダイアログから「構成プロパティ」「リンカー」「入力」を選択し、「追加の依存ファイル」にライブラリディレクトリ”C:\OpenCV2.4.6\opencv\build\x86\vc10\lib”内のライブラリすべてを登録する。

image

今回登録したのは以下の40個のライブラリです。

opencv_calib3d246.lib
opencv_calib3d246d.lib
opencv_contrib246.lib
opencv_contrib246d.lib
opencv_core246.lib
opencv_core246d.lib
opencv_features2d246.lib
opencv_features2d246d.lib
opencv_flann246.lib
opencv_flann246d.lib
opencv_gpu246.lib
opencv_gpu246d.lib
opencv_haartraining_engine.lib
opencv_haartraining_engined.lib
opencv_highgui246.lib
opencv_highgui246d.lib
opencv_imgproc246.lib
opencv_imgproc246d.lib
opencv_legacy246.lib
opencv_legacy246d.lib
opencv_ml246.lib
opencv_ml246d.lib
opencv_nonfree246.lib
opencv_nonfree246d.lib
opencv_objdetect246.lib
opencv_objdetect246d.lib
opencv_ocl246.lib
opencv_ocl246d.lib
opencv_photo246.lib
opencv_photo246d.lib
opencv_stitching246.lib
opencv_stitching246d.lib
opencv_superres246.lib
opencv_superres246d.lib
opencv_ts246.lib
opencv_ts246d.lib
opencv_video246.lib
opencv_video246d.lib
opencv_videostab246.lib
opencv_videostab246d.lib

リリースビルドOKとなりました。しかしデバッグビルドはNGです。以下のエラーがでます。

エラー    1    error LNK2038: '_ITERATOR_DEBUG_LEVEL' の不一致が検出されました。値 '0' が 2 の値 'AssemblyInfo.obj' と一致しません。    C:\Users\2023786\Documents\Visual Studio 2010\Projects\OpenCV_Test\OpenCV_Test\opencv_haartraining_engine.lib(cvsamples.obj)    OpenCV_Test
エラー    2    error LNK2038: '_ITERATOR_DEBUG_LEVEL' の不一致が検出されました。値 '0' が 2 の値 'AssemblyInfo.obj' と一致しません。    C:\Users\2023786\Documents\Visual Studio 2010\Projects\OpenCV_Test\OpenCV_Test\opencv_haartraining_engine.lib(cvcommon.obj)    OpenCV_Test
エラー    3    error LNK2038: '_ITERATOR_DEBUG_LEVEL' の不一致が検出されました。値 '0' が 2 の値 'AssemblyInfo.obj' と一致しません。    C:\Users\2023786\Documents\Visual Studio 2010\Projects\OpenCV_Test\OpenCV_Test\opencv_haartraining_engine.lib(cvhaartraining.obj)    OpenCV_Test
エラー    4    error LNK2038: '_ITERATOR_DEBUG_LEVEL' の不一致が検出されました。値 '0' が 2 の値 'AssemblyInfo.obj' と一致しません。    C:\Users\2023786\Documents\Visual Studio 2010\Projects\OpenCV_Test\OpenCV_Test\opencv_haartraining_engine.lib(cvboost.obj)    OpenCV_Test
エラー    5    error LNK2038: '_ITERATOR_DEBUG_LEVEL' の不一致が検出されました。値 '0' が 2 の値 'AssemblyInfo.obj' と一致しません。    C:\Users\2023786\Documents\Visual Studio 2010\Projects\OpenCV_Test\OpenCV_Test\opencv_haartraining_engine.lib(cvhaarclassifier.obj)    OpenCV_Test
警告    6    warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。    C:\Users\2023786\Documents\Visual Studio 2010\Projects\OpenCV_Test\OpenCV_Test\LINK    OpenCV_Test
エラー    7    error LNK1319: 5 の不一致が検出されました    C:\Users\2023786\Documents\Visual Studio 2010\Projects\OpenCV_Test\Debug\OpenCV_Test.exe    1    1    OpenCV_Test

先に行った、「プロジェクトのプロパティ」ダイアログから「構成プロパティ」「リンカー」「入力」を選択し、「追加の依存ファイル」にライブラリディレクトリ”C:\OpenCV2.4.6\opencv\build\x86\vc10\lib”内のライブラリすべてを登録する。から以下の2つのライブラリを削除したらビルドOKとなった。この2つライブラリの情報にたどり着けなかったので、無視して開発を進めることにします。

opencv_haartraining_engine.lib
opencv_haartraining_engined.lib

インストール編は以上で終了とします。次回はアプリケーションの開発編とします。

 

参考サイト


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。