SlideShare a Scribd company logo
1 of 141
OpenCVを用いた画像処理入門
浦西 友樹 Yuki Uranishi, Ph.D.
uranishi@ieee.org
バージョン情報 1
 スライドのバージョン: 2016.12.27
 想定しているプラットフォームのバージョン
 Microsoft Windows 10
 Microsoft Visual Studio Community 2015
 x64 コンソール アプリケーション
 想定しているライブラリのバージョン
 OpenCV: 3.1
 Microsoft Kinect for Windows SDK: v2
イントロダクション
本はどこにある?
4
どのようにして本を見つけたか?
眼から画像を入力する
持っている知識から,本の特徴を
推定する
画像から,「自分の知っている
本」に似た物体を探す
アイサイト [2]
ステレオ視で前車との距離を計測
危険度に応じて自動制御
5
画像処理・認識技術の応用例
[1] http://www.sony.jp/cyber-shot/products/DSC-T900/
[2] http://www.subaru.jp/eyesight/
スマイルシャッター [1]
笑顔を検出し,シャッターを切る
6
コンピュータにおける画像のデータ構造
𝑥
𝑦
𝑥, 𝑦 0,0 1,0 2,0 …
“1画素”
7
C言語による画像処理プログラミング
例:ビットマップファイルを読み込み,グレースケール画像に変換して保存
 配列
 ポインタ
 繰り返し文
 ヘッダ解析
 データ構造の理解
取り扱うべき概念
必要な作業
OpenCVの基礎知識
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万回以上のダウンロード
10
OpenCVでできること
画像処理
物体認識,学習
変形
キャリブレーション キーポイント検出
フィッティング オプティカルフロー
深度,姿勢推定 コンピュテーショナル
フォトグラフィ
セグメンテーション
http://code.opencv.org/projects/opencv/wiki/OpenCV_Tutorial_CVPR_2015
OpenCVの利点 11
 簡単である
 インストール方法がプラットフォームごとに確立されている
 最新のアルゴリズムも,関数を呼び出すだけで組み込める
 プログラミングが早い,プログラムが速い
 プログラム記述にかかる時間が大幅に短縮される
 プロトタイプのみならず製品にも使用できる,実用十分な速度
 無料であり,自由度が高い
 基本的な処理から最新のアルゴリズムまで含むライブラリが,無料で
提供されている
 商用利用においても,ソースコードを公開せずにオブジェクトコード
を頒布可能 (ライセンス表示は必要)
OpenCV バージョンの変遷 12
 2006/10 OpenCV 1.0
 カメラキャリブレーションをサポート
 2008/10 OpenCV 1.1pre1
 カメラキャプチャとしてvideoInputがサポートされ,cvcamは撤廃
 SURFの導入
 ステレオ視のためのマッチングアルゴリズムの導入
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をサポート
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
 詳細は以降
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
OpenCV 3.0 16
 モジュール構造の刷新
 同じ目的の手法は同じインタフェースで扱えるように
 異なるアルゴリズムを用いたいときに,交換が簡単に
cv::Algorithm
cv::Feature2D cv::StereoMatcher… …
cv::ORB cv::KAZE ……
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
Visual Studio Community 2015
https://www.visualstudio.com/vs-2015-product-editions から入手可能
OpenCVインストール 20
 環境に拠りますが,Windows + Microsoft Visual Studioの組合せでは…
 OpenCVをダウンロード
 ダウンロードしたパッケージを展開
 環境変数の設定
 Microsoft Visual Studioの設定
インストールの注意点 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に読み替える
22
OpenCVのダウンロード
http://opencv.org/downloads.html から各種バージョンを入手可能
現最新バージョンは3.X系は3.2, 2.X系は2.4.13 (2016/12/27現在)
ダウンロードしたファイルを実行するとフォルダが生成される
23
今回想定しているディレクトリ構成
生成されたフォルダは“opencv”という名前になっているので,
“OpenCV3.1”にリネームしてから,Cドライブの直下に置く
(将来的に,バージョン違いのOpenCVを明示的に区別するため)
24
環境変数の設定
“C:OpenCV3.1buildx64vc14bin”
を環境変数Pathに追加
環境変数は値ごとにセミコロンで区切る.たとえば,
…(前の値);C:OpenCV3.1buildx64vc14bin;(次の値)…
25
Visual Studioで使われる用語
ソリューション
…
 プロジェクト
複数のソースファイルを束ねて,一つの実行可能ファイル(など)を作成する単位
 ソリューション
複数のプロジェクトをまとめる単位
プロジェクト1
Source1.cpp
Source1.h
プロジェクト2
Source2.cpp
Source2.h
Source2b.cpp
Source2b.h
プロジェクト1
26
Visual Studioで使われる用語 (Cont’d)
実行可能ファイル (.exe)
main.cpp (ソースファイル)
main関数
func1関数
func2関数
mainオブジェクトコード
func1オブジェクトコード
func2オブジェクトコード
ライブラリファイル
コンパイル
コンパイル
コンパイル
リンク
この一連の動作をビルドと呼ぶ
sbrt.h (ヘッダファイル)
sbrt_func1関数
sbrt_func1オブジェクトコード
コンパイル
27
新しいプロジェクトを作る
「Win32 コンソール アプリケーション」を選択
ソリューション,プロジェクトの名前を付ける
28
新しいプロジェクトを作る (Cont’d)
「空のプロジェクト」を選択
29
ソースファイルを追加
Visual Studioの右側に「ソリューション エクスプローラー」があるので,
「ソース ファイル」を右クリック> 追加> 新しい項目 を選択
30
ソースファイルを追加 (Cont’d)
「C++ファイル」を選択
ソースファイルの名前を付ける
31
インクルード ディレクトリの設定
Visual Studioメニューの プロジェクト (P) > プロパティ (P) > 構成プロパティ
> C/C++> 全般> 「追加のインクルード ディレクトリ」に
“C:OpencV3.1buildinclude”を追加
32
ライブラリ ディレクトリの設定
Visual Studioメニューの プロジェクト (P) > プロパティ (P) > 構成プロパティ
> リンカー> 全般> 「追加のライブラリ ディレクトリ」に,
“C:OpencV3.1buildx64vc14lib”を追加
33
プロジェクトごとの設定
#ifdef _DEBUG
#pragma comment( lib, "opencv_world310d.lib" )
#else
#pragma comment( lib, "opencv_world310.lib" )
#endif
メインとなるソースプログラムに,プロジェクトで用いるライブラリを書き込む
たとえば,
ここまでで設定したのは「どのディレクトリにライブラリがあるか」
実際にどのライブラリを使うかを設定する必要がある
34
プロジェクトごとの設定 もう一つの方法
Visual Studioメニューの プロジェクト (P) > プロパティ (P) > 構成プロパティ
> リンカ > 入力 > 「追加の依存ファイル」に,
プロジェクトで用いるライブラリを記述
(DebugとReleaseでそれぞれ用いるライブラリが異なるので注意)
35
x64 アプリケーションの設定
「x64」を選択
テストプログラムで動作確認 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;
}
空のウインドウが一枚描画されれば正常に動作
OpenCVの基礎的なプログラム
画像を保存
変数を宣言
画像を読み込み
38
画像ファイルの読み込みと保存
cv::imwrite( "output.jpg", src );
src = cv::imread( "sample.jpg" );
cv::Mat src;
画像ファイルの読み込みと保存 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;
}
40
カメラ画像の取り込み
capture >> frame;
cv::namedWindow( "Camera Image" );
cv::imshow( "Camera Image", frame ) ;
cv::VideoCapture capture( 0 );
cv::Mat frame;
カメラから画像を取り込み
変数を宣言
画像をウインドウに表示
ウインドウを作成
カメラ画像の取り込みと表示 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;
}
42
ビデオファイルの読み込みと保存
capture >> frame;
cv::namedWindow( "Camera Image" );
cv::imshow( "Camera Image", frame ) ;
cv::VideoCapture capture( "sample.avi" );
cv::Mat frame;
cv::VideoWriter writer;
ファイルから画像を取り込み
変数を宣言
画像をウインドウに表示
ウインドウを作成
ビデオファイルの読み込みと表示 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;
}
C++インタフェース
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型(後述)のベクトル
C++インタフェース (Cont’d) 46
 クラス化
 後述のcv::Matなど,メソッドもクラスに組み込まれており便利
 メモリ管理の自動化
 cv::Ptr<T>や,std::vector<T>を用いたり,cv::Matを用いると,
メモリ確保や解放を自動で行う
 演算子のオーバーロード
例) 最小二乗問題𝐀𝐱 = 𝐛を解きたいとき
cv::Mat x = ( A.t() * A ).inv() * ( A.t() * b );
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
映像処理の種類(静止画の場合)
幾何的な変換処理
色変換処理
50
スケーリング
𝑥′
𝑦′
=
0.5 0
0 1.5
𝑥
𝑦
𝑥方向の倍率
𝑦方向の倍率
𝑦
𝑥
𝑦
𝑥
51
シアーリング
シアー量を表す値
𝑦
𝑥
𝑦
𝑥
𝑥′
𝑦′
=
1 1
0 1
𝑥
𝑦 =
𝑥 + 𝑦
𝑦
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 𝜙
𝑥 𝑎
𝑦𝑎
53
回転
𝜙 = 45° の回転移動の例
𝜙 = 45
時計回りの回転は,𝜙に負の角度を与えることで実現可能
𝑦
𝑥
𝑦
𝑥
54
移動
今まで扱ってきた変換行列
では,実はこんな
簡単なことができない
𝑦
𝑥
𝑦
𝑥
𝑥′
𝑦′
=
𝑚11 𝑚12
𝑚21 𝑚22
𝑥
𝑦 =
𝑚11 𝑥 𝑚12 𝑦
𝑚21 𝑥 𝑚22 𝑦
𝑥′ = 𝑥 + 𝑥 𝑡
𝑦′
= 𝑦 + 𝑦𝑡
𝑥𝑡, 𝑦𝑡 は移動量
55
移動の変換行列
𝑦
𝑥
𝑦
𝑥
𝑥′
𝑦′
=
1 0 𝑥𝑡
0 1 𝑦𝑡
𝑥
𝑦
1
=
𝑥 + 𝑥𝑡
𝑦 + 𝑦𝑡
𝑥′ = 𝑥 + 𝑥 𝑡
𝑦′
= 𝑦 + 𝑦𝑡
𝑥𝑡, 𝑦𝑡 は移動量
56
アフィン変換
とは,どういうことか?
奥行き方向への変換は,アフィン変換では不可能
元画像で平行な線は,
どのようにアフィン変換しても常に平行になる
これまでの変換の一般的表現
𝑥′
𝑦′ =
𝑎 𝑏 𝑐
𝑑 𝑒 𝑓
𝑥
𝑦
1
を,アフィン変換という
57
射影変換
次のような二次元画像の一般的表現
𝑥′
𝑦′
𝑤
=
𝑎 𝑏 𝑐
𝑑 𝑒 𝑓
𝑔 ℎ 𝑖
𝑥
𝑦
1
を,射影変換などという
58
射影変換の実用的な実装
幾何変換の変換行列を先に求めることは困難
変換前の任意の4点の移動先が決まれば,
連立方程式を解くことで変換行列が求められる
𝑃′
= 𝐴𝑃𝑃′ =
𝑥1′ 𝑦1′
⋮ ⋮
𝑥 𝑛′ 𝑦 𝑛′
𝑃 =
𝑥1 𝑦1
⋮ ⋮
𝑥 𝑛 𝑦 𝑛
行列𝐴を解く問題に帰着
変換前の点を並べた行列
変換後の点を並べた行列
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 ) );
…
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
画像の色変換
たとえば,RGBから1チャンネルグレースケールに変換する
画像の色変換 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
などの多様な変換が可能
64
ヒストグラム
横軸を輝度 (など),縦軸を頻度として,
輝度 (など) ごとの頻度分布を表したもの
Histogram drawn with Adobe Photoshop
輝度
頻度
輝度
頻度
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;
ヒストグラムの計算
ヒストグラムの平坦化
ヒストグラム(輝度値)の線形倍やオフセットは,単に
などと書くことで実現可能
66
変換処理結果
dst = src + 64; equalizeHist元画像
Histogram drawn with Adobe Photoshop
※ヒストグラムの縦軸は最大値で正規化されている
67
2値化
ある閾値以上の値を‘白’,それ以外を‘黒’とし,
白黒2値で画像を表現する
‘白’
‘黒’
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
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
画素への直接アクセス
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に分かれているので
画素への直接アクセス 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
フィルタ演算
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’)
75
エッジ抽出
エッジ: 濃度が急峻に変化する部分
微分(離散画像では差分)画像を求めることで,
エッジ部分を求められるのではないか?
Figure from “OpenCV プログラミングブック第2版”, 毎日コミュニケーションズ, 200
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
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オペレータの場合
78
フィルタの例 – ノイズ除去
画像のノイズ感を低減したりできる(が,画像全体がぼける)
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
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
画像の周波数表現とは?
フーリエ変換の (ごく大雑把な) 特徴
「任意の波形は,三角関数数列の足し合わせで表現できる」
に基づき,二次元信号である画像を正弦波の周波数ごとの係数で表現
http://opencv.jp/opencv2-x-samples/2d_dft_idft
FT
IFT
 高周波成分を除去する (ex. ノイズ除去など)
 特定の方向性をもつ成分だけを抽出 (ex. 縦縞を抽出)
 画像を圧縮する (ex. JPEG)
連続フーリエ変換 (Fourier Transform)
82
離散フーリエ変換,離散コサイン変換
離散コサイン変換 (Discrete Cosine Transform)
 余弦関数列のみを基底として用いるフーリエ変換
 実数に対して変換結果が実数になる
 特定の低周波成分へ要素が集中する傾向がみられる
離散フーリエ変換 (Discrete Fourier Transform)
𝐻 𝜔 =
−∞
∞
ℎ 𝑥 𝑒−𝑗𝜔𝑥 𝑑𝑥
𝐻 𝑘 =
1
𝑁
𝑥=0
𝑁−1
ℎ 𝑥 𝑒−𝑗
2𝜋𝑘𝑥
𝑁
𝐹 𝑘 =
𝑥=0
𝑁−1
cos
𝜋
𝑁
𝑥 +
1
2
𝑘 𝑓 𝑥
※すべて一次元信号 ℎ 𝑥 の周波数スペクトル 𝐻 への写像
83
二次元離散フーリエ変換 (2DDFT)
𝐻 𝑘 𝑥, 𝑘 𝑦 =
1
𝑀𝑁
𝑥=0
𝑀−1
𝑦=0
𝑁−1
ℎ 𝑥, 𝑦 𝑒−𝑗2𝜋
𝑘 𝑥 𝑥+𝑘 𝑦 𝑦
𝑀𝑁
FT
IFT
http://opencv.jp/opencv2-x-samples/2d_dft_idft
𝑀 : 画像の幅
𝑁 : 画像の高さ
基底を二次元の正弦波
𝑠 𝑥, 𝑦 = sin 𝜔 𝑥 𝑥 + 𝜔 𝑦 𝑦
で考えると,二次元信号に対してもフーリエ変換できる
84
周波数空間での画像処理
FT IF
T
黒く塗った部分だけを使用して
逆フーリエ変換
元空間
周波数空間
http://opencv.jp/opencv2-x-samples/2d_dft_idft
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行だけが非ゼロであると仮定する
2値画像処理
87
ラベリング
Copyright (c) 2010, IMURA Masataka, http://imura-lab.org/products/labeling
連続する同一値の前景領域に番号 (ラベル) を付ける
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を選択可能
89
ラベリング結果
2値化 (しきい値192) ラベル画像 (着色)元画像
90
輪郭線追跡
形状特徴解析などに用いられる
画像を背景と前景の二つに分けた時,背景に接する前景部分を追跡する
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 輪郭情報に一様に加えられる位置ずれ量
輪郭情報を格納する領域などを確保する
輪郭線を追跡する
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 描画される輪郭の太さ
輪郭線を描画する
93
直線検出
http://opencv.jp/
応用例
 検出される直線の実世界での平行性を仮定して,消失点を推定する
 建物の壁平面を推定する
94
ハフ変換 − パラメータ空間への直線の写像
y  ax  b
O x
y
O q
r
𝑥 − 𝑦 平面における直線 𝑦 = 𝑎𝑥 + 𝑏 を,𝜃 − 𝜌 平面で考える
( q , r )
q
r
Figure from “OpenCV プログラミングブック第2版”, 毎日コミュニケーションズ (2009)
95
ハフ変換 − パラメータ空間への点の写像
O x
y
( )00 , yx
では,𝑥 − 𝑦 平面における「点」はどうなるか?
x1,y1( )

qq
qqr
sincos
sincos
11
00
yxp
yx


パラメータ空間において曲線が集中する点は,
元画像においてそのパラメータを持つ直線が存在する
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
テンプレートマッチング
「類似度」をどう定義するか?
画像の局所領域と参照画像の類似度を計算し,
最も類似度が高い領域を探索する
 SAD (Sum of Absolute Difference) 差の絶対値の和
 SSD (Sum of Squared Difference) 差の二乗和
 NCC (Normalized Cross Correlation) 正規化相互相関
参照画像
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());
100
テンプレートマッチングの限界
ひとつのテンプレートでは位置姿勢変化に対応できない
101
局所特徴量
たとえばこれらの位置で同じ値を持つような尺度があれば,
対応点を同定可能
局所特徴量の種類 102
 features2d
 ORB
 KAZE
 AKAZE
 BRISK
 FastFeatureDetector
 GFTTDetector
 xfeatures2d (opencv_contribに存在)
 SIFT
 SURF
 StarDetector
 BriefDescriptorExtractor
 FREAK
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 );
…
この部分を差し替えるだけで用いる特徴量を変更可能
104
マッチング結果 (ORB)
E. Rublee et al., “ORB: An Efficient Alternative to SIFT or SURF”, Proc. ICC
カメラの位置姿勢推定
106
カメラの位置姿勢推定
カメラ画像上に存在する点を,
世界座標系での直線の式として表したい
u
v
xy
z
107
世界座標系と画像座標系の座標変換
画像座標と世界座標との変換行列を求める
(ピンホールカメラモデル)
𝑌w
𝑋w
𝑍w
𝑋i𝑌i
𝑍c
𝑋c
𝑌c
世界座標系
Ow
Oc
カメラ座標系
画像座標系
𝑥w, 𝑦w, 𝑧w
𝑥c, 𝑦c, 𝑧c
𝑥i, 𝑦i
Figure from “OpenCV 3 プログラミングブック”, マイナビ (2015)
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
𝐀 =
𝑓𝑥 𝛾 𝑥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
𝑥i = 𝑥id + 𝑑 𝑥
𝑦i = 𝑦id + 𝑑 𝑦
110
他に考慮しなければならないパラメータ
実際に撮影された画像は,レンズに起因する歪みをもつ
レンズ歪みのある画像 レンズ歪みを補正した画像
ピンホールカメラでの
理想的な投影座標
レンズを通した
投影座標
歪み量
𝑑 𝑥 = 𝑥id 𝑘1 𝑟2 + 𝑘2 𝑟4
𝑑 𝑦 = 𝑦id 𝑘1 𝑟2 + 𝑘2 𝑟4
𝑟 = 𝑥id
2
+ 𝑦id
2
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枚以上撮影することで,
カメラパラメータを推定する手法
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. 撮影画像からチェックパターンの交点座標を求める
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
Microsoft Kinectとは?
http://www.xbox.com/ja-JP/kinect/
116
Kinect for Windowsとは?
Microsoftが公式に販売している,”Windows PC向け” Kinect
Kinect for Xbox360と比較して…
 商用利用が許可されている
 近距離計測モード (Near Mode) をサポート,最小計測距離が0.4mに
117
Kinect v1で使われている計測技術
“Light Coding”
http://www.youtube.com/watch?v=nvvQJxgykcU
118
Light Coding
Patent US 2010/0119123 A1
アクティブステレオの一種
Kinect v1で使われている計測技術
119
Light Coding
IR emitter
IR camera
Patent US 2010/0119123 A1
コード化された赤外光
120
Kinect for Windows v2
 ハードウェアおよびソフトウェアの両方を刷新
 現在,オープンベータ版が発売中
121
Kinect v2で使われている計測技術
ある地点から指向性のある光を対象に照射し,
対象表面で反射して帰還するまでの時間を測定
𝑑 =
𝑐Δ𝑡
2
 Light Codingよりも伝統的な手法
 2眼ステレオ視特有のオクルージョン問題が発生しない
では,なぜKinect v1で使われなかったのか?
𝑐: 光速
Δ𝑡: 発光から受光の時間差
Time of Flight (飛行時間) 法
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
KinectのWindows PCでの使用方法 123
 Kinect for Windows SDK
 Microsoft自身によるSDK
 Kinect for Windowsを公式サポート,ハードウェアの全機能を使用可能
 Kinect for Windowsとの組合せによる商用利用を許可
 Kinect for Xbox360との組み合わせは原則不許可
 OpenNI
 GPL, LGPLによりライブラリ自体は商用利用可能
 ただし,Kinect (ハードウェア) のライセンスに注意
 (マルチプラットフォーム)
124
Kinect for Windows SDKの利用
https://www.microsoft.com/en-us/download/details.aspx?id=44561 にアクセス
125
インクルード ディレクトリの設定
Visual Studioメニューの プロジェクト (P) > プロパティ (P) > 構成プロパティ
> C/C++> 全般> 「追加のインクルード ディレクトリ」に
“C:Program FilesMicrosoft SDKsKinectv2.0_1409”を追加
126
ライブラリ ディレクトリの設定
Visual Studioメニューの プロジェクト (P) > プロパティ (P) > 構成プロパティ
> リンカー> 全般> 「追加のライブラリ ディレクトリ」に,
“C:Program FilesMicrosoft SDKsKinectv2.0_1409Libx64”を追加
127
プロジェクトごとの設定
#pragma comment( lib, "kinect20.lib" )
ここまでで設定したのは「どのディレクトリにライブラリがあるか」
実際にどのライブラリを使うかを設定する必要がある
メインとなるソースプログラムに,プロジェクトで用いるライブラリを書き込む
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搭載のカメラ除く)
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
130
PCL: Point Cloud Library
http://pointclouds.org/
 BSDライセンスに基づいて公開されており,商用・研究用途の無償利用可能
 Linux, MacOS, Windows, Androidに対応するクロスプラットフォーム
 ロボットビジョンなどに使用されており,下記の企業などが金銭的に援助
131
PCLの詳しい使用方法
本筋から外れるので,詳しくは…
Yuki Uranishi, Ph.D. 検索
OpenCLでOpenCV
OpenCL (Open Computing Language)
 ヘテロジニアスコンピューティングを実現するためのフレームワーク
 OpenCL C/OpenCL C++言語を用いて記述
 GPGPUのためだけのフレームワークではない
 OpenCV2.4.7以降,インストーラ版OpenCVもOpenCLをサポート
 T-APIにより気軽にGPUを利用可能
133
References
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/
OpenCV, Japanese 136
 opencv.jp
 OpenCVプログラミングブック著者によるリファレンス完訳
 サンプルコード集やクックブックなども充実
 http://opencv.jp/
 イメージングソリューション
 Akira氏による画像処理関連の情報を集めたブログ
 http://imagingsolution.net/
Kinect or PCL, Japanese 137
 DERiVE
 PCLに関する情報が豊富
 http://derivecv.tumblr.com/
 Natural Software
 中村薫氏によるブログ
 Kinect, OpenNIなどのインタフェースに関する情報が豊富
 http://www.naturalsoftware.jp/
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
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
画像処理 参考書籍 140
 オーム社, コンピュータ画像処理
 画像処理系の教科書として多く用いられている
 ISBN 978-4274132643
 共立出版, コンピュータビジョン アルゴリズムと応用
 R. Szelski著 “Computer Vision” の訳本.良訳
 ISBN 978-4320123281
 アドコム・メディア, コンピュータビジョン最先端ガイド1-6
 情報処理学会 CVIM研究会のチュートリアルを書籍化
 コンピュータビジョン系研究者必携のシリーズ

More Related Content

What's hot

画像局所特徴量と特定物体認識 - SIFTと最近のアプローチ -
画像局所特徴量と特定物体認識 - SIFTと最近のアプローチ -画像局所特徴量と特定物体認識 - SIFTと最近のアプローチ -
画像局所特徴量と特定物体認識 - SIFTと最近のアプローチ -
MPRG_Chubu_University
 
Anaconda navigatorのアップデートが終わらないときの対処方法メモ
Anaconda navigatorのアップデートが終わらないときの対処方法メモAnaconda navigatorのアップデートが終わらないときの対処方法メモ
Anaconda navigatorのアップデートが終わらないときの対処方法メモ
ayohe
 
局所特徴量と統計学習手法による物体検出
局所特徴量と統計学習手法による物体検出局所特徴量と統計学習手法による物体検出
局所特徴量と統計学習手法による物体検出
MPRG_Chubu_University
 

What's hot (20)

これからの Vision & Language ~ Acadexit した4つの理由
これからの Vision & Language ~ Acadexit した4つの理由これからの Vision & Language ~ Acadexit した4つの理由
これからの Vision & Language ~ Acadexit した4つの理由
 
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
 
Sift特徴量について
Sift特徴量についてSift特徴量について
Sift特徴量について
 
画像局所特徴量と特定物体認識 - SIFTと最近のアプローチ -
画像局所特徴量と特定物体認識 - SIFTと最近のアプローチ -画像局所特徴量と特定物体認識 - SIFTと最近のアプローチ -
画像局所特徴量と特定物体認識 - SIFTと最近のアプローチ -
 
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
 
物体検出の歴史(R-CNNからSSD・YOLOまで)
物体検出の歴史(R-CNNからSSD・YOLOまで)物体検出の歴史(R-CNNからSSD・YOLOまで)
物体検出の歴史(R-CNNからSSD・YOLOまで)
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks?
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks? 【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks?
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks?
 
Introduction to YOLO detection model
Introduction to YOLO detection modelIntroduction to YOLO detection model
Introduction to YOLO detection model
 
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
 
AHC-Lab M1勉強会 論文の読み方・書き方
AHC-Lab M1勉強会 論文の読み方・書き方AHC-Lab M1勉強会 論文の読み方・書き方
AHC-Lab M1勉強会 論文の読み方・書き方
 
楽しい研究のために今からできること 〜新しく研究を始める皆さんへ〜
楽しい研究のために今からできること 〜新しく研究を始める皆さんへ〜楽しい研究のために今からできること 〜新しく研究を始める皆さんへ〜
楽しい研究のために今からできること 〜新しく研究を始める皆さんへ〜
 
Anaconda navigatorのアップデートが終わらないときの対処方法メモ
Anaconda navigatorのアップデートが終わらないときの対処方法メモAnaconda navigatorのアップデートが終わらないときの対処方法メモ
Anaconda navigatorのアップデートが終わらないときの対処方法メモ
 
Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...
Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...
Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...
 
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
局所特徴量と統計学習手法による物体検出
局所特徴量と統計学習手法による物体検出局所特徴量と統計学習手法による物体検出
局所特徴量と統計学習手法による物体検出
 
【チュートリアル】コンピュータビジョンによる動画認識 v2
【チュートリアル】コンピュータビジョンによる動画認識 v2【チュートリアル】コンピュータビジョンによる動画認識 v2
【チュートリアル】コンピュータビジョンによる動画認識 v2
 
RAFT: Recurrent All-Pairs Field Transforms for Optical Flow
RAFT: Recurrent All-Pairs Field Transforms for Optical FlowRAFT: Recurrent All-Pairs Field Transforms for Optical Flow
RAFT: Recurrent All-Pairs Field Transforms for Optical Flow
 
Towards Total Recall in Industrial Anomaly Detection
Towards Total Recall in Industrial Anomaly DetectionTowards Total Recall in Industrial Anomaly Detection
Towards Total Recall in Industrial Anomaly Detection
 

Similar to OpenCVを用いた画像処理入門

Media Art II 2013 第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv
Media Art II 2013  第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCvMedia Art II 2013  第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv
Media Art II 2013 第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv
Atsushi Tadokoro
 
cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋
Tomoaki Shimizu
 
OpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみたOpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみた
徹 上野山
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
 
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考えるNetラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
david9142
 

Similar to OpenCVを用いた画像処理入門 (20)

Media Art II 2013 第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv
Media Art II 2013  第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCvMedia Art II 2013  第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv
Media Art II 2013 第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv
 
OpenCV2.2 Install Guide ver.0.5
OpenCV2.2 Install Guide ver.0.5OpenCV2.2 Install Guide ver.0.5
OpenCV2.2 Install Guide ver.0.5
 
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携
 
Intel OpenVINO™ ツールキットのご紹介
Intel OpenVINO™ ツールキットのご紹介Intel OpenVINO™ ツールキットのご紹介
Intel OpenVINO™ ツールキットのご紹介
 
cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋
 
OpenCVの入り口
OpenCVの入り口OpenCVの入り口
OpenCVの入り口
 
OpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみたOpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみた
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorp
 
Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!
 
Hbstudy41 auto scaling
Hbstudy41 auto scalingHbstudy41 auto scaling
Hbstudy41 auto scaling
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
 
cocos2d-x公開講座 in 鹿児島
cocos2d-x公開講座 in 鹿児島cocos2d-x公開講座 in 鹿児島
cocos2d-x公開講座 in 鹿児島
 
20161022 Linux on Azureの世界
20161022 Linux on Azureの世界20161022 Linux on Azureの世界
20161022 Linux on Azureの世界
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
[DL輪読会]GQNと関連研究,世界モデルとの関係について
[DL輪読会]GQNと関連研究,世界モデルとの関係について[DL輪読会]GQNと関連研究,世界モデルとの関係について
[DL輪読会]GQNと関連研究,世界モデルとの関係について
 
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
 
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考えるNetラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
 
181106 02
181106 02181106 02
181106 02
 
【第27回コンピュータビジョン勉強会@関東】OpenCV 便利Tips紹介
【第27回コンピュータビジョン勉強会@関東】OpenCV 便利Tips紹介【第27回コンピュータビジョン勉強会@関東】OpenCV 便利Tips紹介
【第27回コンピュータビジョン勉強会@関東】OpenCV 便利Tips紹介
 

Recently uploaded

The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
koheioishi1
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
YukiTerazawa
 

Recently uploaded (8)

ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
 
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
 
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
 

OpenCVを用いた画像処理入門

Editor's Notes

  1. 75