OpenCVを用いた画像処理入門

13,260 views

Published on

OpenCVを用いた画像処理入門
by 浦西 友樹 (Yuki Uranishi)

Published in: Education

OpenCVを用いた画像処理入門

  1. 1. OpenCVを用いた画像処理入門 浦西 友樹 Yuki Uranishi, Ph.D. uranishi@ieee.org
  2. 2. バージョン情報 1  スライドのバージョン: 2016.12.27  想定しているプラットフォームのバージョン  Microsoft Windows 10  Microsoft Visual Studio Community 2015  x64 コンソール アプリケーション  想定しているライブラリのバージョン  OpenCV: 3.1  Microsoft Kinect for Windows SDK: v2
  3. 3. イントロダクション
  4. 4. 本はどこにある?
  5. 5. 4 どのようにして本を見つけたか? 眼から画像を入力する 持っている知識から,本の特徴を 推定する 画像から,「自分の知っている 本」に似た物体を探す
  6. 6. アイサイト [2] ステレオ視で前車との距離を計測 危険度に応じて自動制御 5 画像処理・認識技術の応用例 [1] http://www.sony.jp/cyber-shot/products/DSC-T900/ [2] http://www.subaru.jp/eyesight/ スマイルシャッター [1] 笑顔を検出し,シャッターを切る
  7. 7. 6 コンピュータにおける画像のデータ構造 𝑥 𝑦 𝑥, 𝑦 0,0 1,0 2,0 … “1画素”
  8. 8. 7 C言語による画像処理プログラミング 例:ビットマップファイルを読み込み,グレースケール画像に変換して保存  配列  ポインタ  繰り返し文  ヘッダ解析  データ構造の理解 取り扱うべき概念 必要な作業
  9. 9. OpenCVの基礎知識
  10. 10. OpenCV (Open Computer Vision Library) 9  Intel社,Willow Garage社を経て,2016年現在はitseez社が開発 (itseez社は2016年にIntelに買収された)  http://opencv.org/  BSD (Berkeley Software Distribution) ライセンスに基づいて配布  再配布の際ソースコード開示が不要  マルチプラットフォーム  Windows, Linux, Mac OS, iOS, Androidに対応  C/C++/Python/Javaインタフェースが用意されている  CPUおよびGPUの各種並列計算ライブラリに対応  並列処理可能な環境において,高速な動作が期待される 画像処理においてはデファクトスタンダードになりつつあり, これまでに全世界で1,000万回以上のダウンロード
  11. 11. 10 OpenCVでできること 画像処理 物体認識,学習 変形 キャリブレーション キーポイント検出 フィッティング オプティカルフロー 深度,姿勢推定 コンピュテーショナル フォトグラフィ セグメンテーション http://code.opencv.org/projects/opencv/wiki/OpenCV_Tutorial_CVPR_2015
  12. 12. OpenCVの利点 11  簡単である  インストール方法がプラットフォームごとに確立されている  最新のアルゴリズムも,関数を呼び出すだけで組み込める  プログラミングが早い,プログラムが速い  プログラム記述にかかる時間が大幅に短縮される  プロトタイプのみならず製品にも使用できる,実用十分な速度  無料であり,自由度が高い  基本的な処理から最新のアルゴリズムまで含むライブラリが,無料で 提供されている  商用利用においても,ソースコードを公開せずにオブジェクトコード を頒布可能 (ライセンス表示は必要)
  13. 13. OpenCV バージョンの変遷 12  2006/10 OpenCV 1.0  カメラキャリブレーションをサポート  2008/10 OpenCV 1.1pre1  カメラキャプチャとしてvideoInputがサポートされ,cvcamは撤廃  SURFの導入  ステレオ視のためのマッチングアルゴリズムの導入
  14. 14. OpenCV バージョンの変遷 (Cont’d) 13  2009/09 OpenCV 2.0  新たなC++インタフェースの導入  新たな特徴抽出アルゴリズムの実装  インストール構成,およびインストール方法の抜本的な変更  2010/04 OpenCV 2.1  並列化ライブラリをOpenMPからIntel TBB (Threading Building Blocks) に変更  Pythonをサポート  2010/12 OpenCV 2.2  大幅なライブラリ構成の変更  Androidをサポート
  15. 15. OpenCV バージョンの変遷 (Cont’d) 14  2011.7 OpenCV 2.3  GPUのサポート  2012.5 OpenCV 2.4  cv::Algorithmクラスの導入  SIFTおよびSURFがnonfreeライブラリへ移動  2015.6 OpenCV 3.0  2015.12 OpenCV 3.1  詳細は以降
  16. 16. OpenCV 3.0 15  C++インタフェースへの移行を促進  Cインタフェースから段階的に脱却する  Base + Contributions モデルを採用  より柔軟な拡張を目指す  nonfreeなライブラリはcontributionsへ http://code.opencv.org/projects/opencv/wiki/OpenCV_Tutorial_CVPR_2015 OpenCV 2.x OpenCV contributions OpenCV 3.x base
  17. 17. OpenCV 3.0 16  モジュール構造の刷新  同じ目的の手法は同じインタフェースで扱えるように  異なるアルゴリズムを用いたいときに,交換が簡単に cv::Algorithm cv::Feature2D cv::StereoMatcher… … cv::ORB cv::KAZE ……
  18. 18. T-API (Transparent API) 17  以前は 並列化するか否かはソースプログラムを書き換えて区別  cv::Canny (CPU), ocl::Canny (OpenCL), gpu::Canny (CUDA)  OpenCV 3.0から同じ実行時コードで,実行環境に合わせてCPUとGPUを 使い分けられるように  再コンパイルの必要なし  適用される関数は順次増加 (と思われる) http://code.opencv.org/projects/opencv/wiki/OpenCV_Tutorial_CVPR_2015
  19. 19. 開発環境の導入方法
  20. 20. 19 Visual Studio Community 2015 https://www.visualstudio.com/vs-2015-product-editions から入手可能
  21. 21. OpenCVインストール 20  環境に拠りますが,Windows + Microsoft Visual Studioの組合せでは…  OpenCVをダウンロード  ダウンロードしたパッケージを展開  環境変数の設定  Microsoft Visual Studioの設定
  22. 22. インストールの注意点 21  本テキストでは…  Visual Studio Community 2015を例示  Visual Studio Express 2013を用いる場合,以後のディレクトリパスに おいてvc14をvc12に読み替える  x64 アプリケーション (64bit) のビルドを例示  32ビット版アプリケーションをビルドする必要がある場合,以後の ディレクトリパスにおいてx64をx86に読み替える  x64アプリケーションの設定を行う必要なし (詳細後述)  OpenCV 3.1の使用を例示  OpenCV 3.0を用いる場合,以後のディレクトリパスにおいて OpenCV3.1をOpenCV3.0に読み替える
  23. 23. 22 OpenCVのダウンロード http://opencv.org/downloads.html から各種バージョンを入手可能 現最新バージョンは3.X系は3.2, 2.X系は2.4.13 (2016/12/27現在) ダウンロードしたファイルを実行するとフォルダが生成される
  24. 24. 23 今回想定しているディレクトリ構成 生成されたフォルダは“opencv”という名前になっているので, “OpenCV3.1”にリネームしてから,Cドライブの直下に置く (将来的に,バージョン違いのOpenCVを明示的に区別するため)
  25. 25. 24 環境変数の設定 “C:OpenCV3.1buildx64vc14bin” を環境変数Pathに追加 環境変数は値ごとにセミコロンで区切る.たとえば, …(前の値);C:OpenCV3.1buildx64vc14bin;(次の値)…
  26. 26. 25 Visual Studioで使われる用語 ソリューション …  プロジェクト 複数のソースファイルを束ねて,一つの実行可能ファイル(など)を作成する単位  ソリューション 複数のプロジェクトをまとめる単位 プロジェクト1 Source1.cpp Source1.h プロジェクト2 Source2.cpp Source2.h Source2b.cpp Source2b.h
  27. 27. プロジェクト1 26 Visual Studioで使われる用語 (Cont’d) 実行可能ファイル (.exe) main.cpp (ソースファイル) main関数 func1関数 func2関数 mainオブジェクトコード func1オブジェクトコード func2オブジェクトコード ライブラリファイル コンパイル コンパイル コンパイル リンク この一連の動作をビルドと呼ぶ sbrt.h (ヘッダファイル) sbrt_func1関数 sbrt_func1オブジェクトコード コンパイル
  28. 28. 27 新しいプロジェクトを作る 「Win32 コンソール アプリケーション」を選択 ソリューション,プロジェクトの名前を付ける
  29. 29. 28 新しいプロジェクトを作る (Cont’d) 「空のプロジェクト」を選択
  30. 30. 29 ソースファイルを追加 Visual Studioの右側に「ソリューション エクスプローラー」があるので, 「ソース ファイル」を右クリック> 追加> 新しい項目 を選択
  31. 31. 30 ソースファイルを追加 (Cont’d) 「C++ファイル」を選択 ソースファイルの名前を付ける
  32. 32. 31 インクルード ディレクトリの設定 Visual Studioメニューの プロジェクト (P) > プロパティ (P) > 構成プロパティ > C/C++> 全般> 「追加のインクルード ディレクトリ」に “C:OpencV3.1buildinclude”を追加
  33. 33. 32 ライブラリ ディレクトリの設定 Visual Studioメニューの プロジェクト (P) > プロパティ (P) > 構成プロパティ > リンカー> 全般> 「追加のライブラリ ディレクトリ」に, “C:OpencV3.1buildx64vc14lib”を追加
  34. 34. 33 プロジェクトごとの設定 #ifdef _DEBUG #pragma comment( lib, "opencv_world310d.lib" ) #else #pragma comment( lib, "opencv_world310.lib" ) #endif メインとなるソースプログラムに,プロジェクトで用いるライブラリを書き込む たとえば, ここまでで設定したのは「どのディレクトリにライブラリがあるか」 実際にどのライブラリを使うかを設定する必要がある
  35. 35. 34 プロジェクトごとの設定 もう一つの方法 Visual Studioメニューの プロジェクト (P) > プロパティ (P) > 構成プロパティ > リンカ > 入力 > 「追加の依存ファイル」に, プロジェクトで用いるライブラリを記述 (DebugとReleaseでそれぞれ用いるライブラリが異なるので注意)
  36. 36. 35 x64 アプリケーションの設定 「x64」を選択
  37. 37. テストプログラムで動作確認 36 #include <opencv2/opencv.hpp> int main( int argc, char** argv ) { cv::Mat Image( 480, 640, CV_8UC3 ); cv::imshow( "test", Image ); cv::waitKey( 0 ); return 0; } 空のウインドウが一枚描画されれば正常に動作
  38. 38. OpenCVの基礎的なプログラム
  39. 39. 画像を保存 変数を宣言 画像を読み込み 38 画像ファイルの読み込みと保存 cv::imwrite( "output.jpg", src ); src = cv::imread( "sample.jpg" ); cv::Mat src;
  40. 40. 画像ファイルの読み込みと保存 39 #include <opencv2/opencv.hpp> #ifdef _DEBUG #pragma comment( lib, "opencv_world310d.lib" ) #else #pragma comment( lib, "opencv_world310.lib" ) #endif int main( int argc, char** argv ) { // 変数を宣言,画像を読み込み cv::Mat src = cv::imread( "sample.jpg" ); // 画像を表示 cv::imshow( "Source", src ); // 画像を保存 cv::imwrite( "output.jpg", src ); // キー入力を待つ cv::waitKey( 0 ); return 0; }
  41. 41. 40 カメラ画像の取り込み capture >> frame; cv::namedWindow( "Camera Image" ); cv::imshow( "Camera Image", frame ) ; cv::VideoCapture capture( 0 ); cv::Mat frame; カメラから画像を取り込み 変数を宣言 画像をウインドウに表示 ウインドウを作成
  42. 42. カメラ画像の取り込みと表示 41 #include <opencv2/opencv.hpp> // ライブラリファイルのリンクは省略 int main( int argc, char** argv ) { // 変数を宣言 cv::VideoCapture capture( 0 ); cv::Mat frame; // ウインドウを作成 cv::namedWindow( "Camera Image" ); // カメラ画像を取り込んで表示 for( ;; ) { capture >> frame; cv::imshow( "Camera Image", frame ); if( cv::waitKey( 30 ) == 27 ) { break; } } return 0; }
  43. 43. 42 ビデオファイルの読み込みと保存 capture >> frame; cv::namedWindow( "Camera Image" ); cv::imshow( "Camera Image", frame ) ; cv::VideoCapture capture( "sample.avi" ); cv::Mat frame; cv::VideoWriter writer; ファイルから画像を取り込み 変数を宣言 画像をウインドウに表示 ウインドウを作成
  44. 44. ビデオファイルの読み込みと表示 43 #include <opencv2/opencv.hpp> // ライブラリファイルのリンクは省略 int main( int argc, char** argv ) { // ビデオを読み込む cv::VideoCapture capture( "sample.avi" ); cv::Mat frame; cv::VideoWriter writer( "output.avi", cv::VideoWriter::fourcc( 'X', 'V', 'I', 'D' ), capture.get( cv::CAP_PROP_FPS ), cv::Size( (int)capture.get( cv::CAP_PROP_FRAME_WIDTH ), (int)capture.get( cv::CAP_PROP_FRAME_HEIGHT ) ) ); // ウインドウを作成 cv::namedWindow( "Video Image" ); // ビデオファイルを読み込み,表示して保存 for( ;; ) { capture >> frame; if( frame.empty() ) { break; } cv::imshow( "Video Image", frame ); cv::waitKey( 1000 / capture.get( cv::CAP_PROP_FPS ) ); writer << frame; } return 0; }
  45. 45. C++インタフェース
  46. 46. C++インタフェース 45  cv名前空間の導入  伴って,関数名のプレフィックスcvが削除 例) ウインドウを作成 cv::namedWindow( "Window Name" );  テンプレートの導入 例) IplImageのポインタを宣言 cv::Ptr<IplImage> img = cvLoadImage( "lenna.png" ); 例) cv::Mat型のベクトルを宣言 std::vector<cv::Mat> planes; //cv::Mat型(後述)のベクトル
  47. 47. C++インタフェース (Cont’d) 46  クラス化  後述のcv::Matなど,メソッドもクラスに組み込まれており便利  メモリ管理の自動化  cv::Ptr<T>や,std::vector<T>を用いたり,cv::Matを用いると, メモリ確保や解放を自動で行う  演算子のオーバーロード 例) 最小二乗問題𝐀𝐱 = 𝐛を解きたいとき cv::Mat x = ( A.t() * A ).inv() * ( A.t() * b );
  48. 48. 47 cv::Mat cv::Mat a, b; int val; 例)行列同士の演算,行列とスカラーの演算 a = a + b; b = a * val; 例)行列aの2行目にスカラーvalを掛けて3行目に加える matrix.row( 2 ) += val * a.row( 1 ); 例)Matのコンストラクタ引数としてIplImage型を指定し, Mat型のヘッダで,同一の実体を指すインスタンスを作成する IplImage oldImg = cvLoadImage( "lenna.png" ); cv::Mat img( oldImg ); 画像を含む行列を取り扱うためのクラス
  49. 49. 幾何的画像処理
  50. 50. 49 映像処理の種類(静止画の場合) 幾何的な変換処理 色変換処理
  51. 51. 50 スケーリング 𝑥′ 𝑦′ = 0.5 0 0 1.5 𝑥 𝑦 𝑥方向の倍率 𝑦方向の倍率 𝑦 𝑥 𝑦 𝑥
  52. 52. 51 シアーリング シアー量を表す値 𝑦 𝑥 𝑦 𝑥 𝑥′ 𝑦′ = 1 1 0 1 𝑥 𝑦 = 𝑥 + 𝑦 𝑦
  53. 53. 52 回転 𝛼 𝜙 (加法定理) 𝑥 𝑏, 𝑦 𝑏 𝑥 𝑎, 𝑦𝑎 𝑦 𝑥 𝑥 𝑎 = 𝑟 cos 𝛼 𝑦𝑎 = 𝑟 sin 𝛼 ただし,𝑟 = 𝑥 𝑎 2 + 𝑦𝑎 2 = 𝑥 𝑏 2 + 𝑦 𝑏 2 いま, 𝑥 𝑏, 𝑦 𝑏 は 𝛼 + 𝜙 だけ回転しているので 𝑥 𝑏 = 𝑟 cos 𝛼 + 𝜙 = 𝑟 cos 𝛼 cos 𝜙 − 𝑟 sin 𝛼 sin 𝜙 𝑦 𝑏 = 𝑟 sin 𝛼 + 𝜙 = 𝑟 sin 𝛼 cos 𝜙 − 𝑟 cos 𝛼 sin 𝜙 𝑥 𝑎 = 𝑟 cos 𝛼 , 𝑦𝑎 = 𝑟 sin 𝛼 𝑥 𝑏 = 𝑥 𝑎 cos 𝜙 − 𝑦𝑎 sin 𝜙 𝑦 𝑏 = 𝑦𝑎 cos 𝜙 + 𝑥 𝑎 sin 𝜙 = 𝑥 𝑎 sin 𝜙 + 𝑦𝑎 cos 𝜙 これを行列表記すると, 𝑥 𝑏 𝑦 𝑏 = cos 𝜙 − sin 𝜙 sin 𝜙 cos 𝜙 𝑥 𝑎 𝑦𝑎
  54. 54. 53 回転 𝜙 = 45° の回転移動の例 𝜙 = 45 時計回りの回転は,𝜙に負の角度を与えることで実現可能 𝑦 𝑥 𝑦 𝑥
  55. 55. 54 移動 今まで扱ってきた変換行列 では,実はこんな 簡単なことができない 𝑦 𝑥 𝑦 𝑥 𝑥′ 𝑦′ = 𝑚11 𝑚12 𝑚21 𝑚22 𝑥 𝑦 = 𝑚11 𝑥 𝑚12 𝑦 𝑚21 𝑥 𝑚22 𝑦 𝑥′ = 𝑥 + 𝑥 𝑡 𝑦′ = 𝑦 + 𝑦𝑡 𝑥𝑡, 𝑦𝑡 は移動量
  56. 56. 55 移動の変換行列 𝑦 𝑥 𝑦 𝑥 𝑥′ 𝑦′ = 1 0 𝑥𝑡 0 1 𝑦𝑡 𝑥 𝑦 1 = 𝑥 + 𝑥𝑡 𝑦 + 𝑦𝑡 𝑥′ = 𝑥 + 𝑥 𝑡 𝑦′ = 𝑦 + 𝑦𝑡 𝑥𝑡, 𝑦𝑡 は移動量
  57. 57. 56 アフィン変換 とは,どういうことか? 奥行き方向への変換は,アフィン変換では不可能 元画像で平行な線は, どのようにアフィン変換しても常に平行になる これまでの変換の一般的表現 𝑥′ 𝑦′ = 𝑎 𝑏 𝑐 𝑑 𝑒 𝑓 𝑥 𝑦 1 を,アフィン変換という
  58. 58. 57 射影変換 次のような二次元画像の一般的表現 𝑥′ 𝑦′ 𝑤 = 𝑎 𝑏 𝑐 𝑑 𝑒 𝑓 𝑔 ℎ 𝑖 𝑥 𝑦 1 を,射影変換などという
  59. 59. 58 射影変換の実用的な実装 幾何変換の変換行列を先に求めることは困難 変換前の任意の4点の移動先が決まれば, 連立方程式を解くことで変換行列が求められる 𝑃′ = 𝐴𝑃𝑃′ = 𝑥1′ 𝑦1′ ⋮ ⋮ 𝑥 𝑛′ 𝑦 𝑛′ 𝑃 = 𝑥1 𝑦1 ⋮ ⋮ 𝑥 𝑛 𝑦 𝑛 行列𝐴を解く問題に帰着 変換前の点を並べた行列 変換後の点を並べた行列
  60. 60. 59 幾何変換のプログラム int main( int argc, char** argv ) { const std::string windowNameSrc = "Source"; const std::string windowNameDst = "Destination"; // 画像を読み込む cv::Mat src = cv::imread( std::string( "..lenna.png" ) ); cv::Mat dst = src.clone(); // 対応する4点を保存するための変数を宣言 std::vector<cv::Point2f> pointsSrc; std::vector<cv::Point2f> pointsDst; // Srcの4点を獲得 pointsSrc.push_back( cv::Point2f( 0.0, 0.0 ) ); pointsSrc.push_back( cv::Point2f( 0.0, (float)( dst.rows - 1 ) ) ); pointsSrc.push_back( cv::Point2f( (float)( dst.cols - 1 ), (float)( dst.rows - 1 ) ) ); pointsSrc.push_back( cv::Point2f( (float)( dst.cols - 1 ), 0.0 ) ); …
  61. 61. 60 幾何変換のプログラム(続き) … // Dstの4点を獲得 pointsDst.push_back( cv::Point2f( 10.0, 10.0 ) ); pointsDst.push_back( cv::Point2f( 20.0, 400.0 ) ); pointsDst.push_back( cv::Point2f( 400.0, 300.0 ) ); pointsDst.push_back( cv::Point2f( 500.0, 20.0 ) ); // 4点の対応関係から射影変換行列を獲得 cv::Mat transMat = cv::getPerspectiveTransform( pointsSrc, pointsDst ); // 獲得した射影変換行列を用いて,画像を実際に射影変換 cv::warpPerspective( src, dst, transMat, cv::Size( dst.cols, dst.rows ) ); // ウインドウを作成して表示 cv::namedWindow( windowNameSrc, CV_WINDOW_AUTOSIZE ); cv::namedWindow( windowNameDst, CV_WINDOW_AUTOSIZE ); cv::imshow( windowNameSrc, src ); cv::imshow( windowNameDst, dst ); cv::waitKey( 0 ); return 0; }
  62. 62. 光学的画像処理
  63. 63. 62 画像の色変換 たとえば,RGBから1チャンネルグレースケールに変換する
  64. 64. 画像の色変換 63 int main( int argc, char** argv ) { // 変数の宣言 cv::Mat src = cv::imread( "sample.jpg" ); // ファイルから画像をsrcに読み込む cv::Mat gray; // グレースケール画像 // 3チャンネルBGR画像から1チャンネルグレースケール画像に変換する cv::cvtColor( src, gray, cv::COLOR_BGR2GRAY, 1 ); // ウインドウを作成して結果を描画する cv::imshow( "Src", src ); cv::imshow( "Gray", gray ); cv::waitKey( 0 ); return 0; } ほかにも cv::COLOR_BGR2XYZ, cv::COLOR_XYZ2BGR cv::COLOR_BGR2YCrCb, cv::COLOR_YCrCb2BGR cv::COLOR_BGR2HSV, cv::COLOR_HSV2BGR cv::COLOR_BGR2HLS, cv::COLOR_HLS2BGR cv::COLOR_BGR2Lab, cv::COLOR_Lab2BGR cv::COLOR_BGR2Luv, cv::COLOR_Luv2BGR cv::COLOR_BayerBG2BGR などの多様な変換が可能
  65. 65. 64 ヒストグラム 横軸を輝度 (など),縦軸を頻度として, 輝度 (など) ごとの頻度分布を表したもの Histogram drawn with Adobe Photoshop 輝度 頻度 輝度 頻度
  66. 66. 65 OpenCVで実現する関数 cv::calcHist( const cv::Mat* arrays, int narrays, const int* channels, const cv::Mat& mask, cv::MatND& hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false ); cv::equalizeHist( cv::InputArray src, cv::OutputArray dst ); src 入力画像 (8ビット1チャンネル限定) dst ヒストグラム平坦化画像 cv::Mat dst = 2 * src + 64; ヒストグラムの計算 ヒストグラムの平坦化 ヒストグラム(輝度値)の線形倍やオフセットは,単に などと書くことで実現可能
  67. 67. 66 変換処理結果 dst = src + 64; equalizeHist元画像 Histogram drawn with Adobe Photoshop ※ヒストグラムの縦軸は最大値で正規化されている
  68. 68. 67 2値化 ある閾値以上の値を‘白’,それ以外を‘黒’とし, 白黒2値で画像を表現する ‘白’ ‘黒’
  69. 69. cv::threshold( const cv::Mat& src, cv::Mat& dst, double thresh, double maxVal, int thresholdtype ); src 入力画像(1チャンネル) dst 出力画像(1チャンネル) thresh 閾値 maxVal 下の閾値判定時に用いる値 thresholdtype 閾値判定の種類(右図) 68 OpenCVで2値化する際に用いる関数 thresh maxVal Figure based on The Reference Manual. Input cv::THRESH_BINARY cv:: THRESH_TRUNC cv:: THRESH_TOZERO cv:: THRESH_TOZERO_IN
  70. 70. 69 cv::thresholdなどを用いた2値化の例 int main( int argc, char** argv ) { // 変数の宣言 cv::Mat src = cv::imread( "lenna.png" ); // ファイルから画像をsrcに読み込む cv::Mat bin( src.size(), CV_8UC1 ); // 8ビット1チャンネルのMat型インスタンス // 3チャンネルBGR画像から1チャンネルグレースケール画像に変換する cv::cvtColor( src, gray, cv::COLOR_BGR2GRAY, 1 ); // 閾値により2値化する.この場合は閾値を128とする cv::threshold( gray, bin, 128, 255, cv::THRESH_BINARY ); // ウインドウを作成して結果を描画する cv::imshow( "Binarized", bin) ; cv::waitKey( 0 ); return 0; }
  71. 71. 画素への直接アクセス
  72. 72. 71 画素への直接アクセス cols rows 画像は2次元のデータだが,計算機のメモリ空間は1次元 たとえば2次元的に(x1 ,y1)の座標を持つ点のR成分は, 行y1の左端からx1 * 3 + 2 の位置にある (x1, y1) … (0, 0) (1, 0)(x, y) a[0] a[1] a[2] a[3] a[4] a[5]Array さらに,各画素はBGRに分かれているので
  73. 73. 画素への直接アクセス 72 int main( int argc, char** argv ) { // 画像の読み込み cv::Mat src = cv::imread( "sample.jpg" ); // 各行の先頭を指すポインタを用いる方法 for( int y = 0; y < src.cols; y++ ) { uchar* ptr = src.ptr<uchar>( y ); for( int x = 0; x < src.rows; x++ ) { ptr[x * src.channels() + 0] += 32; ptr[x * src.channels() + 1] += 32; ptr[x * src.channels() + 2] += 32; } } // ウインドウを作成して表示 cv::imshow( "Source", src ); cv::waitKey( 0 ); return 0; } 足した結果,値が255を超えた場合はどうする?
  74. 74. 空間フィルタ
  75. 75. 74 フィルタ演算 0 1 1 0 0 -1 -1 0 1 2 1 0 0 -1 -2 -1 2 3 1 0 0 -1 -3 -2 3 3 0 0 0 0 -3 -3 3 3 0 0 0 0 -3 -3 2 3 1 0 0 -1 -3 -2 1 2 1 0 0 -1 -2 -1 0 1 1 0 0 -1 -1 0 ※画像外を指し示すときは, 暗黙的に値が ‘0’ であることを仮定 -1 0 1 -1 0 1 -1 0 1 dst(1, 1) = -1 * 0 + 0 * 0 + 1 * 0 + -1 * 0 + 0 * 0 + 1 * 1 + -1 * 0 + 0 * 1 + 1 * 1 = 2 dstsrc(白が ‘1’,黒が ‘0’)
  76. 76. 75 エッジ抽出 エッジ: 濃度が急峻に変化する部分 微分(離散画像では差分)画像を求めることで, エッジ部分を求められるのではないか? Figure from “OpenCV プログラミングブック第2版”, 毎日コミュニケーションズ, 200
  77. 77. 76 勾配画像を求めるためのフィルタ Laplacian Sobel (Vertical) Sobel (Horizontal) Source -1 0 1 -2 0 2 -1 0 1 -1 -2 -1 0 0 0 1 2 1 1 1 1 1 -8 1 1 1 1
  78. 78. 77 OpenCVでエッジを抽出する関数 cv::Sobel( cv::Mat src, cv::Mat dst, int ddepth, int xorder, int yorder, int ksize = 3, double scale = 1, double delta = 0, int borderType = cv::BORDER_DEFAULT ); ddepth 出力画像のビット深さ (負数を与えると,srcのdepthと同じになる) xorder x方向における導関数の次数 yorder y方向における導関数の次数 ksize フィルタサイズ(1, 3, 5, 7から選択) (以下,詳細はリファレンス参照) Sobelオペレータの場合
  79. 79. 78 フィルタの例 – ノイズ除去 画像のノイズ感を低減したりできる(が,画像全体がぼける) 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9
  80. 80. 79 任意のフィルタを適用する関数 cv::filter2D( cv::Mat src, cv::Mat dst, int ddepth, cv::Mat kernel, cv::Point anchor=Point(-1,-1), double delta=0, int borderType=cv::BORDER_DEFAULT ); ddepth 出力画像のビット深さ (負数を与えると,srcのdepthと同じになる) kernel 使用するカーネル anchor カーネルの中心位置を指定 ((-1, -1)とすると,カーネル中心をそのまま使う) delta バイアス値 borderType 画像の周辺部分の取り扱い方を指定
  81. 81. 周波数フィルタ
  82. 82. 81 画像の周波数表現とは? フーリエ変換の (ごく大雑把な) 特徴 「任意の波形は,三角関数数列の足し合わせで表現できる」 に基づき,二次元信号である画像を正弦波の周波数ごとの係数で表現 http://opencv.jp/opencv2-x-samples/2d_dft_idft FT IFT  高周波成分を除去する (ex. ノイズ除去など)  特定の方向性をもつ成分だけを抽出 (ex. 縦縞を抽出)  画像を圧縮する (ex. JPEG)
  83. 83. 連続フーリエ変換 (Fourier Transform) 82 離散フーリエ変換,離散コサイン変換 離散コサイン変換 (Discrete Cosine Transform)  余弦関数列のみを基底として用いるフーリエ変換  実数に対して変換結果が実数になる  特定の低周波成分へ要素が集中する傾向がみられる 離散フーリエ変換 (Discrete Fourier Transform) 𝐻 𝜔 = −∞ ∞ ℎ 𝑥 𝑒−𝑗𝜔𝑥 𝑑𝑥 𝐻 𝑘 = 1 𝑁 𝑥=0 𝑁−1 ℎ 𝑥 𝑒−𝑗 2𝜋𝑘𝑥 𝑁 𝐹 𝑘 = 𝑥=0 𝑁−1 cos 𝜋 𝑁 𝑥 + 1 2 𝑘 𝑓 𝑥 ※すべて一次元信号 ℎ 𝑥 の周波数スペクトル 𝐻 への写像
  84. 84. 83 二次元離散フーリエ変換 (2DDFT) 𝐻 𝑘 𝑥, 𝑘 𝑦 = 1 𝑀𝑁 𝑥=0 𝑀−1 𝑦=0 𝑁−1 ℎ 𝑥, 𝑦 𝑒−𝑗2𝜋 𝑘 𝑥 𝑥+𝑘 𝑦 𝑦 𝑀𝑁 FT IFT http://opencv.jp/opencv2-x-samples/2d_dft_idft 𝑀 : 画像の幅 𝑁 : 画像の高さ 基底を二次元の正弦波 𝑠 𝑥, 𝑦 = sin 𝜔 𝑥 𝑥 + 𝜔 𝑦 𝑦 で考えると,二次元信号に対してもフーリエ変換できる
  85. 85. 84 周波数空間での画像処理 FT IF T 黒く塗った部分だけを使用して 逆フーリエ変換 元空間 周波数空間 http://opencv.jp/opencv2-x-samples/2d_dft_idft
  86. 86. OpenCVでDFTを行う関数 85 実際に使うときには… 1. 画像を最適なサイズになるように拡大する 2. 実数部と虚数部を格納するインスタンスを宣言する 3. DFTを行う 4. 実数部と虚数部からノルムを計算する 5. 対数にスケーリングする 6. 1. で拡大したサイズを元に戻す 7. 正規化する cv::dft( cv::Mat src, cv::Mat dst, int flags=0, int nonzeroRows=0 ); src 入力画像 dst 出力画像 flags 処理の際のフラグ nonzeroRows 0以外を指定すると, 最初のnonzeroRows行だけが非ゼロであると仮定する
  87. 87. 2値画像処理
  88. 88. 87 ラベリング Copyright (c) 2010, IMURA Masataka, http://imura-lab.org/products/labeling 連続する同一値の前景領域に番号 (ラベル) を付ける
  89. 89. 88 OpenCVでラベリングする関数 int cv::connectedComponents( InputArray image, OutputArray labels, int connectivity = 8, int ltype = CV_32S ); image 入力画像 labels 出力画像 connectivity 連結性.8連結か4連結を選択 ltype 出力画像の各画素値の値.CV_32SかCV_16Uを選択可能
  90. 90. 89 ラベリング結果 2値化 (しきい値192) ラベル画像 (着色)元画像
  91. 91. 90 輪郭線追跡 形状特徴解析などに用いられる 画像を背景と前景の二つに分けた時,背景に接する前景部分を追跡する
  92. 92. 91 OpenCVで輪郭線を追跡する関数 std::vector<std::vector<cv::Point> > contours; std::vector<cv::Vec4i> hierarchy; cv::findContours( const cv::Mat& image, std::vector<std::vector<Point> >& contours, std::vector<cv::Vec4i>& hierarchy, int mode, int method, cv::Point offset=Point() ); image 対象画像 (1チャンネル) contours 輪郭情報を格納する領域 hierarchy 階層構造を格納する領域 mode どの輪郭を抽出するかを決定 method 輪郭抽出アルゴリズム offset 輪郭情報に一様に加えられる位置ずれ量 輪郭情報を格納する領域などを確保する 輪郭線を追跡する
  93. 93. 92 OpenCVで輪郭を取得する関数 (Cont’d) cv::drawContours( cv::Mat& image, const std::vector<std::vector<cv::Point> >& contours, int contourIdx, const cv::Scalar& color, int thickness=1, int lineType=8, const std::vector<cv::Vec4i>& hierarchy=std::vector<cv::Vec4i>(), int maxLevel=INT_MAX, cv::Point offset=Point() ); contourIdx 特にどれかの輪郭だけを描画したいとき,その番号.負数を与え るとすべての輪郭を描画する color 描画される輪郭の色 thickness 描画される輪郭の太さ 輪郭線を描画する
  94. 94. 93 直線検出 http://opencv.jp/ 応用例  検出される直線の実世界での平行性を仮定して,消失点を推定する  建物の壁平面を推定する
  95. 95. 94 ハフ変換 − パラメータ空間への直線の写像 y  ax  b O x y O q r 𝑥 − 𝑦 平面における直線 𝑦 = 𝑎𝑥 + 𝑏 を,𝜃 − 𝜌 平面で考える ( q , r ) q r
  96. 96. Figure from “OpenCV プログラミングブック第2版”, 毎日コミュニケーションズ (2009) 95 ハフ変換 − パラメータ空間への点の写像 O x y ( )00 , yx では,𝑥 − 𝑦 平面における「点」はどうなるか? x1,y1( )  qq qqr sincos sincos 11 00 yxp yx   パラメータ空間において曲線が集中する点は, 元画像においてそのパラメータを持つ直線が存在する
  97. 97. 96 OpenCVでハフ変換を行う関数 void cv::HoughLines( cv::Mat& image, std::vector<cv::Vec2f>& lines, double rho, double theta, int threshold, double srn = 0, double stn = 0 ); image 入力画像.8ビット1チャンネル,画素値0以外の画素が対象 lines 推定されたラインの値.( r, q ) の値の組のベクトル rho パラメータr の分解能 theta パラメータq の分解能 threshold 閾値.投票数がこの値以上のパラメータを直線とみなす srn r の分解能rhoの除数.0の場合は古典的ハフ変換となる stn q の分解能thetaの除数.0の場合は古典的ハフ変換となる ハフ変換を行う関数
  98. 98. テンプレートマッチング
  99. 99. 98 テンプレートマッチング 「類似度」をどう定義するか? 画像の局所領域と参照画像の類似度を計算し, 最も類似度が高い領域を探索する  SAD (Sum of Absolute Difference) 差の絶対値の和  SSD (Sum of Squared Difference) 差の二乗和  NCC (Normalized Cross Correlation) 正規化相互相関 参照画像
  100. 100. 99 OpenCVで対応領域を取得する関数 void cv::matchTemplate( const cv::Mat& image, const cv::Mat& templ, cv::Mat& result, int method ); image 入力画像 templ テンプレート画像 result 類似度マップ method 類似度を選択 CV_TM_SQDIFF: SSD CV_TM_CCORR_NORMED: NCC など テンプレートマッチングを用いて類似度マップを作成 類似度マップから最大最小値を見つけるために便利な関数 void cv::minMaxLoc( const cv::Mat& src, double* min_val, double* max_val,Point* minLoc, cv::Point* maxLoc,const cv::Mat& mask=Mat());
  101. 101. 100 テンプレートマッチングの限界 ひとつのテンプレートでは位置姿勢変化に対応できない
  102. 102. 101 局所特徴量 たとえばこれらの位置で同じ値を持つような尺度があれば, 対応点を同定可能
  103. 103. 局所特徴量の種類 102  features2d  ORB  KAZE  AKAZE  BRISK  FastFeatureDetector  GFTTDetector  xfeatures2d (opencv_contribに存在)  SIFT  SURF  StarDetector  BriefDescriptorExtractor  FREAK
  104. 104. 103 局所特徴量の計算とマッチング … // 使用する特徴量の定義.今回はORBを用いる cv::Ptr<cv::ORB> detector = cv::ORB::create(); // キーポイントの抽出 std::vector<cv::KeyPoint> keypoint_src, keypoint_ref; detector->detect( src, keypoint_src ); detector->detect( ref, keypoint_ref ); // 特徴量の計算 cv::Mat descriptor_src, descriptor_ref; detector->compute( src, keypoint_src, descriptor_src ); detector->compute( ref, keypoint_ref, descriptor_ref ); // 特徴量のマッチング cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create( "BruteForce" ); std::vector<cv::DMatch> match_sr; matcher->match( descriptor_src, descriptor_ref, match_sr ); // マッチング結果の描画と出力 cv::Mat dst; cv::drawMatches( src, keypoint_src, ref, keypoint_ref, match_sr, dst ); … この部分を差し替えるだけで用いる特徴量を変更可能
  105. 105. 104 マッチング結果 (ORB) E. Rublee et al., “ORB: An Efficient Alternative to SIFT or SURF”, Proc. ICC
  106. 106. カメラの位置姿勢推定
  107. 107. 106 カメラの位置姿勢推定 カメラ画像上に存在する点を, 世界座標系での直線の式として表したい u v xy z
  108. 108. 107 世界座標系と画像座標系の座標変換 画像座標と世界座標との変換行列を求める (ピンホールカメラモデル) 𝑌w 𝑋w 𝑍w 𝑋i𝑌i 𝑍c 𝑋c 𝑌c 世界座標系 Ow Oc カメラ座標系 画像座標系 𝑥w, 𝑦w, 𝑧w 𝑥c, 𝑦c, 𝑧c 𝑥i, 𝑦i Figure from “OpenCV 3 プログラミングブック”, マイナビ (2015)
  109. 109. 108 画像座標と世界座標との変換 この変換行列を求めればよい Figure from “OpenCV 3 プログラミングブック”, マイナビ (2015) 𝑌w 𝑋w 𝑍w 𝑋i𝑌i 𝑍c 𝑋c 𝑌c Ow Oc 𝑥w, 𝑦w, 𝑧w 𝑥c, 𝑦c, 𝑧c 𝑥i, 𝑦i 𝑠𝐩 = 𝐀 𝐑|𝐓 𝐏 𝑠 𝑥i 𝑦i 1 = 𝐀 𝐑|𝐓 𝑥w 𝑦w 𝑧w 1
  110. 110. 𝐀 = 𝑓𝑥 𝛾 𝑥c0 0 𝑓𝑦 𝑦c0 0 0 1 = 𝑓𝑠 𝑥 𝑓𝑘 𝑠 𝑥c0 0 𝑓𝑠 𝑦 𝑦c0 0 0 1 𝐑 = cos 𝜃𝑧 − sin 𝜃𝑧 0 sin 𝜃𝑧 cos 𝜃𝑧 0 0 0 1 cos 𝜃 𝑦 0 sin 𝜃 𝑦 0 1 0 − sin 𝜃 𝑦 0 cos 𝜃 𝑦 1 0 0 0 cos 𝜃 𝑥 − sin 𝜃 𝑥 0 sin 𝜃 𝑥 cos 𝜃 𝑥 = 𝑟11 𝑟12 𝑟13 𝑟21 𝑟22 𝑟23 𝑟31 𝑟32 𝑟33 𝐓 = 𝑡 𝑥 𝑡 𝑦 𝑡 𝑧 𝐑|𝐓 = 𝑟11 𝑟12 𝑟13 𝑟21 𝑟22 𝑟23 𝑟31 𝑟32 𝑟33 𝑡 𝑥 𝑡 𝑦 𝑡 𝑧 109 画像座標と世界座標との変換 (Cont’d) 各軸周りの回転行列 平行移動の行列 スケール,シアー,移動 𝑠𝐩 = 𝐀 𝐑|𝐓 𝐏 𝑠 𝑥i 𝑦i 1 = 𝐀 𝐑|𝐓 𝑥w 𝑦w 𝑧w 1
  111. 111. 𝑥i = 𝑥id + 𝑑 𝑥 𝑦i = 𝑦id + 𝑑 𝑦 110 他に考慮しなければならないパラメータ 実際に撮影された画像は,レンズに起因する歪みをもつ レンズ歪みのある画像 レンズ歪みを補正した画像 ピンホールカメラでの 理想的な投影座標 レンズを通した 投影座標 歪み量 𝑑 𝑥 = 𝑥id 𝑘1 𝑟2 + 𝑘2 𝑟4 𝑑 𝑦 = 𝑦id 𝑘1 𝑟2 + 𝑘2 𝑟4 𝑟 = 𝑥id 2 + 𝑦id 2
  112. 112. 111 OpenCVでのカメラキャリブレーション 変換行列を実際に求める古典的な流れは… 1. 世界座標系での座標値が既知の点を6点以上用意する 2. 上記の点が観測されたときの画像座標系での値を求める 3. 世界座標系での座標値と画像座標系での座標値の組から, 変換行列を求める Z. Zhang, “A Flexible New Technique for Camera Calibration”, IEEE Trans. PAMI, 22(11), pp.1330-1334 (2000) OpenCVでは,Zhangのキャリブレーション手法が実装されている 平面チェックパターンを3枚以上撮影することで, カメラパラメータを推定する手法
  113. 113. 112 カメラキャリブレーションの流れ bool cv::findChessboardCorners( const cv::Mat& image, cv::Size patternSize, std::vector<Point2f>& corners, int flags = CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_NORMALIZE_IMAGE); image 入力画像 (平面チェックパターンを撮影した画像) patternSize チェックパターンの交点の数.cv::Size(列, 行)で指定する corners 検出された交点の座標を出力する配列 flags 実行時のオプション 1. 撮影画像からチェックパターンの交点座標を求める
  114. 114. 113 カメラキャリブレーションの流れ (Cont’d) double cv::calibrateCamera( const std::vector< std::vector<cv::Point3f> >& objectPoints, const std::vector< std::vector<cv::Point2f> >& imagePoints, cv::Size imageSize, cv::Mat& cameraMatrix, cv::Mat& distCoeffs, std::vector<Mat>& rvecs, std::vector<Mat>& tvecs, int flags = 0 ); objectPoints 参照点の世界座標系における三次元座標値の組 imagePoints objectPointsと対応する点の,画像上での座標値の組 imageSize 画像サイズ cameraMatrix カメラの内部パラメータ行列 distCoeffs カメラの歪み行列 rvecs 回転ベクトル.撮影画像ごとに求められる tvecs 平行移動ベクトル.撮影画像ごとに求められる flags 実行時のオプション 2. カメラパラメータを推定する
  115. 115. 距離画像センサによる三次元形状の 実時間取得
  116. 116. 115 Microsoft Kinectとは? http://www.xbox.com/ja-JP/kinect/
  117. 117. 116 Kinect for Windowsとは? Microsoftが公式に販売している,”Windows PC向け” Kinect Kinect for Xbox360と比較して…  商用利用が許可されている  近距離計測モード (Near Mode) をサポート,最小計測距離が0.4mに
  118. 118. 117 Kinect v1で使われている計測技術 “Light Coding” http://www.youtube.com/watch?v=nvvQJxgykcU
  119. 119. 118 Light Coding Patent US 2010/0119123 A1 アクティブステレオの一種 Kinect v1で使われている計測技術
  120. 120. 119 Light Coding IR emitter IR camera Patent US 2010/0119123 A1 コード化された赤外光
  121. 121. 120 Kinect for Windows v2  ハードウェアおよびソフトウェアの両方を刷新  現在,オープンベータ版が発売中
  122. 122. 121 Kinect v2で使われている計測技術 ある地点から指向性のある光を対象に照射し, 対象表面で反射して帰還するまでの時間を測定 𝑑 = 𝑐Δ𝑡 2  Light Codingよりも伝統的な手法  2眼ステレオ視特有のオクルージョン問題が発生しない では,なぜKinect v1で使われなかったのか? 𝑐: 光速 Δ𝑡: 発光から受光の時間差 Time of Flight (飛行時間) 法
  123. 123. 122 Kinect for Windows v1とv2の違い Kinect for Windows v1 Kinect for Windows v2 測定原理 Light Coding (Active Stereo) Time of Flight RGB解像度 640x480 pixels 1920x1080 pixels Depth解像度 320x240 pixels 512x424 pixels 同時姿勢推定人数 2 persons 6 persons 計測深度範囲 0.8-4.0 m / 0.4-3.0 m (near) 0.5-4.5 m 計測水平角度範囲 57 deg 70 deg 計測垂直角度範囲 43 deg 60 deg 動作OS Windows 7 or later Windows 8 or later http://www.buildinsider.net/small/kinectv2cpp/01
  124. 124. KinectのWindows PCでの使用方法 123  Kinect for Windows SDK  Microsoft自身によるSDK  Kinect for Windowsを公式サポート,ハードウェアの全機能を使用可能  Kinect for Windowsとの組合せによる商用利用を許可  Kinect for Xbox360との組み合わせは原則不許可  OpenNI  GPL, LGPLによりライブラリ自体は商用利用可能  ただし,Kinect (ハードウェア) のライセンスに注意  (マルチプラットフォーム)
  125. 125. 124 Kinect for Windows SDKの利用 https://www.microsoft.com/en-us/download/details.aspx?id=44561 にアクセス
  126. 126. 125 インクルード ディレクトリの設定 Visual Studioメニューの プロジェクト (P) > プロパティ (P) > 構成プロパティ > C/C++> 全般> 「追加のインクルード ディレクトリ」に “C:Program FilesMicrosoft SDKsKinectv2.0_1409”を追加
  127. 127. 126 ライブラリ ディレクトリの設定 Visual Studioメニューの プロジェクト (P) > プロパティ (P) > 構成プロパティ > リンカー> 全般> 「追加のライブラリ ディレクトリ」に, “C:Program FilesMicrosoft SDKsKinectv2.0_1409Libx64”を追加
  128. 128. 127 プロジェクトごとの設定 #pragma comment( lib, "kinect20.lib" ) ここまでで設定したのは「どのディレクトリにライブラリがあるか」 実際にどのライブラリを使うかを設定する必要がある メインとなるソースプログラムに,プロジェクトで用いるライブラリを書き込む
  129. 129. 128 Kinectとカメラでの座標軸の違い カメラ座標系 𝐏c 𝑥c, 𝑦c, 𝑧c 𝑧c 𝑦c 𝑥c Kinect座標系 𝐏r 𝑥r, 𝑦r, 𝑧r 𝑧r 𝑦r 𝑥r 世界座標系 𝐏w 𝑥w, 𝑦w, 𝑧w 𝑧w 𝑦w 𝑥w  Kinectの計測データはKinect座標系で表現される  他の座標系との対応関係は未知 (Kinect搭載のカメラ除く)
  130. 130. 129 KinectとCameraの画像をどう関連付けるか カメラ座標系 𝐏c 𝑥c, 𝑦c, 𝑧c 𝑧c 𝑦c 𝑥c Kinect座標系 𝐏r 𝑥r, 𝑦r, 𝑧r 𝑧r 𝑦r 𝑥r 𝐌cR 𝐌rc 座標系間の剛体変換行列を求めることで画像間の対応関係を得る (カメラ外部パラメータのキャリブレーション) 世界座標系 𝐏w 𝑥w, 𝑦w, 𝑧w 𝑧w 𝑦w 𝑥w
  131. 131. 130 PCL: Point Cloud Library http://pointclouds.org/  BSDライセンスに基づいて公開されており,商用・研究用途の無償利用可能  Linux, MacOS, Windows, Androidに対応するクロスプラットフォーム  ロボットビジョンなどに使用されており,下記の企業などが金銭的に援助
  132. 132. 131 PCLの詳しい使用方法 本筋から外れるので,詳しくは… Yuki Uranishi, Ph.D. 検索
  133. 133. OpenCLでOpenCV
  134. 134. OpenCL (Open Computing Language)  ヘテロジニアスコンピューティングを実現するためのフレームワーク  OpenCL C/OpenCL C++言語を用いて記述  GPGPUのためだけのフレームワークではない  OpenCV2.4.7以降,インストーラ版OpenCVもOpenCLをサポート  T-APIにより気軽にGPUを利用可能 133
  135. 135. References
  136. 136. OpenCV, English 135  OpenCV (Official)  http://opencv.org/  フォーラムでの議論が活発  Open Source Computer Vision Library (User Group)  http://groups.yahoo.com/neo/groups/OpenCV/info  メッセージは減少しつつあり,公式フォーラムに移行の傾向  Opencv documentation  公式に提供されているオンラインリファレンス  http://docs.opencv.org/
  137. 137. OpenCV, Japanese 136  opencv.jp  OpenCVプログラミングブック著者によるリファレンス完訳  サンプルコード集やクックブックなども充実  http://opencv.jp/  イメージングソリューション  Akira氏による画像処理関連の情報を集めたブログ  http://imagingsolution.net/
  138. 138. Kinect or PCL, Japanese 137  DERiVE  PCLに関する情報が豊富  http://derivecv.tumblr.com/  Natural Software  中村薫氏によるブログ  Kinect, OpenNIなどのインタフェースに関する情報が豊富  http://www.naturalsoftware.jp/
  139. 139. OpenCV 参考書籍 138  マイナビ, OpenCV 2 プログラミングブック  ISBN 978-4839941260  オライリージャパン, 詳解 OpenCV  Learning OpenCVの訳本  ISBN 978-4873114132  Packt Publishing, Mastering OpenCV with Practical Computer Vision Projects  ISBN 978-1849517829  講談社, OpenCVによる画像処理入門  画像処理の教科書として書かれた書籍  ISBN 978-4061538221
  140. 140. OpenCV 3.0 参考書籍 139  O’REILLY, Learning OpenCV For Version 3.0  Adrian Kaebler and Gary Bradski [著]  Early Release済,本発売は “August 2016”  マイナビ, OpenCV 3 プログラミングブック  藤本雄一郎, 青砥隆仁, 浦西友樹, 大倉史生, 小枝正直, 中島悠太, 山本豪志朗 [著]  ISBN 978-4839952969
  141. 141. 画像処理 参考書籍 140  オーム社, コンピュータ画像処理  画像処理系の教科書として多く用いられている  ISBN 978-4274132643  共立出版, コンピュータビジョン アルゴリズムと応用  R. Szelski著 “Computer Vision” の訳本.良訳  ISBN 978-4320123281  アドコム・メディア, コンピュータビジョン最先端ガイド1-6  情報処理学会 CVIM研究会のチュートリアルを書籍化  コンピュータビジョン系研究者必携のシリーズ

×