More Related Content Similar to OpenCVを用いた画像処理入門 (20) OpenCVを用いた画像処理入門2. バージョン情報 1
スライドのバージョン: 2016.12.27
想定しているプラットフォームのバージョン
Microsoft Windows 10
Microsoft Visual Studio Community 2015
x64 コンソール アプリケーション
想定しているライブラリのバージョン
OpenCV: 3.1
Microsoft Kinect for Windows SDK: v2
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万回以上のダウンロード
12. OpenCVの利点 11
簡単である
インストール方法がプラットフォームごとに確立されている
最新のアルゴリズムも,関数を呼び出すだけで組み込める
プログラミングが早い,プログラムが速い
プログラム記述にかかる時間が大幅に短縮される
プロトタイプのみならず製品にも使用できる,実用十分な速度
無料であり,自由度が高い
基本的な処理から最新のアルゴリズムまで含むライブラリが,無料で
提供されている
商用利用においても,ソースコードを公開せずにオブジェクトコード
を頒布可能 (ライセンス表示は必要)
13. OpenCV バージョンの変遷 12
2006/10 OpenCV 1.0
カメラキャリブレーションをサポート
2008/10 OpenCV 1.1pre1
カメラキャプチャとしてvideoInputがサポートされ,cvcamは撤廃
SURFの導入
ステレオ視のためのマッチングアルゴリズムの導入
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. 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. 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. OpenCV 3.0 16
モジュール構造の刷新
同じ目的の手法は同じインタフェースで扱えるように
異なるアルゴリズムを用いたいときに,交換が簡単に
cv::Algorithm
cv::Feature2D cv::StereoMatcher… …
cv::ORB cv::KAZE ……
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
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に読み替える
27. プロジェクト1
26
Visual Studioで使われる用語 (Cont’d)
実行可能ファイル (.exe)
main.cpp (ソースファイル)
main関数
func1関数
func2関数
mainオブジェクトコード
func1オブジェクトコード
func2オブジェクトコード
ライブラリファイル
コンパイル
コンパイル
コンパイル
リンク
この一連の動作をビルドと呼ぶ
sbrt.h (ヘッダファイル)
sbrt_func1関数
sbrt_func1オブジェクトコード
コンパイル
34. 33
プロジェクトごとの設定
#ifdef _DEBUG
#pragma comment( lib, "opencv_world310d.lib" )
#else
#pragma comment( lib, "opencv_world310.lib" )
#endif
メインとなるソースプログラムに,プロジェクトで用いるライブラリを書き込む
たとえば,
ここまでで設定したのは「どのディレクトリにライブラリがあるか」
実際にどのライブラリを使うかを設定する必要がある
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;
}
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;
}
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;
}
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. 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. 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 );
画像を含む行列を取り扱うためのクラス
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. 53
回転
𝜙 = 45° の回転移動の例
𝜙 = 45
時計回りの回転は,𝜙に負の角度を与えることで実現可能
𝑦
𝑥
𝑦
𝑥
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. 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;
}
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
などの多様な変換が可能
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. 66
変換処理結果
dst = src + 64; equalizeHist元画像
Histogram drawn with Adobe Photoshop
※ヒストグラムの縦軸は最大値で正規化されている
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. 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;
}
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を超えた場合はどうする?
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’)
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オペレータの場合
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 画像の周辺部分の取り扱い方を指定
83. 連続フーリエ変換 (Fourier Transform)
82
離散フーリエ変換,離散コサイン変換
離散コサイン変換 (Discrete Cosine Transform)
余弦関数列のみを基底として用いるフーリエ変換
実数に対して変換結果が実数になる
特定の低周波成分へ要素が集中する傾向がみられる
離散フーリエ変換 (Discrete Fourier Transform)
𝐻 𝜔 =
−∞
∞
ℎ 𝑥 𝑒−𝑗𝜔𝑥 𝑑𝑥
𝐻 𝑘 =
1
𝑁
𝑥=0
𝑁−1
ℎ 𝑥 𝑒−𝑗
2𝜋𝑘𝑥
𝑁
𝐹 𝑘 =
𝑥=0
𝑁−1
cos
𝜋
𝑁
𝑥 +
1
2
𝑘 𝑓 𝑥
※すべて一次元信号 ℎ 𝑥 の周波数スペクトル 𝐻 への写像
84. 83
二次元離散フーリエ変換 (2DDFT)
𝐻 𝑘 𝑥, 𝑘 𝑦 =
1
𝑀𝑁
𝑥=0
𝑀−1
𝑦=0
𝑁−1
ℎ 𝑥, 𝑦 𝑒−𝑗2𝜋
𝑘 𝑥 𝑥+𝑘 𝑦 𝑦
𝑀𝑁
FT
IFT
http://opencv.jp/opencv2-x-samples/2d_dft_idft
𝑀 : 画像の幅
𝑁 : 画像の高さ
基底を二次元の正弦波
𝑠 𝑥, 𝑦 = sin 𝜔 𝑥 𝑥 + 𝜔 𝑦 𝑦
で考えると,二次元信号に対してもフーリエ変換できる
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行だけが非ゼロであると仮定する
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 描画される輪郭の太さ
輪郭線を描画する
96. Figure from “OpenCV プログラミングブック第2版”, 毎日コミュニケーションズ (2009)
95
ハフ変換 − パラメータ空間への点の写像
O x
y
( )00 , yx
では,𝑥 − 𝑦 平面における「点」はどうなるか?
x1,y1( )
qq
qqr
sincos
sincos
11
00
yxp
yx
パラメータ空間において曲線が集中する点は,
元画像においてそのパラメータを持つ直線が存在する
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の場合は古典的ハフ変換となる
ハフ変換を行う関数
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());
103. 局所特徴量の種類 102
features2d
ORB
KAZE
AKAZE
BRISK
FastFeatureDetector
GFTTDetector
xfeatures2d (opencv_contribに存在)
SIFT
SURF
StarDetector
BriefDescriptorExtractor
FREAK
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 );
…
この部分を差し替えるだけで用いる特徴量を変更可能
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. 𝑥i = 𝑥id + 𝑑 𝑥
𝑦i = 𝑦id + 𝑑 𝑦
110
他に考慮しなければならないパラメータ
実際に撮影された画像は,レンズに起因する歪みをもつ
レンズ歪みのある画像 レンズ歪みを補正した画像
ピンホールカメラでの
理想的な投影座標
レンズを通した
投影座標
歪み量
𝑑 𝑥 = 𝑥id 𝑘1 𝑟2 + 𝑘2 𝑟4
𝑑 𝑦 = 𝑦id 𝑘1 𝑟2 + 𝑘2 𝑟4
𝑟 = 𝑥id
2
+ 𝑦id
2
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. カメラパラメータを推定する
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. KinectのWindows PCでの使用方法 123
Kinect for Windows SDK
Microsoft自身によるSDK
Kinect for Windowsを公式サポート,ハードウェアの全機能を使用可能
Kinect for Windowsとの組合せによる商用利用を許可
Kinect for Xbox360との組み合わせは原則不許可
OpenNI
GPL, LGPLによりライブラリ自体は商用利用可能
ただし,Kinect (ハードウェア) のライセンスに注意
(マルチプラットフォーム)
131. 130
PCL: Point Cloud Library
http://pointclouds.org/
BSDライセンスに基づいて公開されており,商用・研究用途の無償利用可能
Linux, MacOS, Windows, Androidに対応するクロスプラットフォーム
ロボットビジョンなどに使用されており,下記の企業などが金銭的に援助
134. OpenCL (Open Computing Language)
ヘテロジニアスコンピューティングを実現するためのフレームワーク
OpenCL C/OpenCL C++言語を用いて記述
GPGPUのためだけのフレームワークではない
OpenCV2.4.7以降,インストーラ版OpenCVもOpenCLをサポート
T-APIにより気軽にGPUを利用可能
133
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. OpenCV, Japanese 136
opencv.jp
OpenCVプログラミングブック著者によるリファレンス完訳
サンプルコード集やクックブックなども充実
http://opencv.jp/
イメージングソリューション
Akira氏による画像処理関連の情報を集めたブログ
http://imagingsolution.net/
138. Kinect or PCL, Japanese 137
DERiVE
PCLに関する情報が豊富
http://derivecv.tumblr.com/
Natural Software
中村薫氏によるブログ
Kinect, OpenNIなどのインタフェースに関する情報が豊富
http://www.naturalsoftware.jp/
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. 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. 画像処理 参考書籍 140
オーム社, コンピュータ画像処理
画像処理系の教科書として多く用いられている
ISBN 978-4274132643
共立出版, コンピュータビジョン アルゴリズムと応用
R. Szelski著 “Computer Vision” の訳本.良訳
ISBN 978-4320123281
アドコム・メディア, コンピュータビジョン最先端ガイド1-6
情報処理学会 CVIM研究会のチュートリアルを書籍化
コンピュータビジョン系研究者必携のシリーズ