コンピュータビジョンについての解説書。コンピュータが「目」を持ち、情報に基づいて意思決定することが可能なアプリケーションをどう開発するかについて、OpenCVの開発者であるGary Bradski氏が詳しく解説します。本書を読めば、研究者や開発者も電子ホビーストもOpenCVが提供するフレームワークの使い方を身につけてすぐに活用できます。シンプルなものから最新鋭のものまでさまざまなビジョンアプリケーションを作ることができるようになるでしょう。日本語版では巻末付録として、OpenCV高速化テクニック、Webカメラで手や物体を感知するディスプレイの作成方法について加筆しました。
詳解 OpenCV
―コンピュータビジョンライブラリを使った画像処理・認識
Gary Bradski, Adrian Kaehler 著、松田 晃一 訳
- TOPICS
- Programming , C/C++
- 発行年月日
- 2009年08月
- PRINT LENGTH
- 640
- ISBN
- 978-4-87311-413-2
- 原書
- Learning OpenCV
- FORMAT
関連ファイル
正誤表
ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。
正誤表 - 2009年10月掲載(2刷以降は修正済み)
■P.2 L.5(下から)
- 【誤】 静止カメラ
- 【正】 デジタルスチルカメラ
- 【誤】 決定は、「このシーンに ... 」
- 【正】 決定したいことは、「このシーンに ... 」
- 【誤】 マシンビジョンシステムでは
- 【正】 機械によるビジョンシステムでは
- 【誤】 Machin Learning
- 【正】 Machine Learning
- 【誤】 ML
- 【正】 MLL
- 【誤】 パッケージされたルーチンがライブラリにはないような処理
- 【正】 あらかじめパッケージ化されたルーチンがライブラリにはないような処理
- 【誤】 imageDataポインタはバイトポインタ(uchar *)です。指されているデータは必ずしもuchar型
- 【正】 imageDataポインタはバイトポインタ(char *)です。指されているデータは必ずしもchar型
- 【誤】 COI(注目カラーチャンネル)
- 【正】 COI(注目チャンネル)
- 【誤】 cvSetImage ROI(src, cvRect(x,y,width,height));
- 【正】 cvSetImageROI(src, cvRect(x,y,width,height));
- 【誤】 cvSetImage ROI(src1, cvRect(x,y,width,height));
- 【正】 cvSetImageROI(src1, cvRect(x,y,width,height));
- 【誤】 出力共分散行列
- 【正】 出力される共分散行列
- 【誤】 最後にデータ型変換を実行します
- 【正】 最後にデータの型変換を実行します
- 【誤】 疎な配列も同様に
- 【正】 疎な配列†も同様に
- 【正】 †訳注:要素の一部しか定義されていない行列。OpenCVでは疎な配列用にCvSparseMat型が用意されている。
- 【誤】 maskがNULLでない場合この関数は、maskの0の要素に対応するdstの要素は変更しません。
- 【正】 scaleが1以外の場合、dstの各要素はscaleを乗算されます。
- 【誤】 このようなヘッダの修正には、メモリの確保やデータのコピーは含まれないことに注意することが大切です。
- 【正】 注意してほしいのは、このようなヘッダの修正ではヘッダだけが修正され、メモリを確保したりデータがコピーしたりはしないというこです。
- 【誤】 OpenCVでは、「ベクトル」はサイズがn×1か1×nの行列と見なしていることを
- 【正】 OpenCVでは「ベクトル」を、サイズがn×1か1×nの行列と見なしていることを
- 【誤】 maskがNULLでない場合、この関数は、maskの0の要素に対応するdstの要素はどれも変更しません。
- 【正】 scaleが1以外の場合、dstの各要素はscaleを乗算されます。
- 【誤】 追加のセグメントが
- 【正】 追加の線分が
- 【誤】 サイズはいくつか(320×240)
- 【正】 サイズはいくつか(320×200)
- 【誤】 ありせん
- 【正】 ありません
- 【誤】 1,3
- 【正】 1〜4
- 【誤】 1,3
- 【正】 1,3,4
- 【誤】 32f 8u
- 【正】 8u
- 【誤】 図5-5 バイラテラル平滑化の結果
- 【正】 図5-5 バイラテラル平滑化
- 【誤】 Θ
- 【正】 ○に−
- 【誤】 PyrUp()がPyrDown() ... これはPyrDown()が
- 【正】 cvPyrUpがcvPyrDown() ... これはcvPyrDown()が
- 【誤】 PyrUp()オペレータの
- 【正】 cvPyrUp()オペレータの
- 【誤】 PyrUp(Gi+1)
- 【正】 cvPyrUp(Gi+1)
- 【誤】 パラメータ分解能
- 【正】 パラメータの分解能
- 【誤】 srcは3次元の配列で
- 【正】 srcは3チャンネルの配列で
- 【誤】 投影は2次元から2次元になる、
- 【正】 投影は2次元から2次元になり、
- 【誤】 FILL_OUTLIERS(未定義となる点を塗りつぶす)
- 【正】 FILL_OUTLIERS(未定義となる点を0で塗りつぶす)
- 【誤】 onzero_rowsパラメータ
- 【正】 nonzero_rowsパラメータ
- 【誤】 √n=
- 【正】 √C_n= ※「n」は下付き文字
- 【誤】 N
- 【正】 2N
- 【誤】 (image(x,y))^2
- 【正】 image(x,y)
- 【誤】 tilt_sum
- 【正】 tiled_sum
- 【誤】 オブジェクトの位置についての説を
- 【正】 オブジェクトの位置についての仮説を
- 【誤】 と呼んでください
- 【正】 と読んでください
- 【誤】 √Σ_i H_1^'2(i)・H_2^'2(i)
- 【正】 √Σ_i H_1^'2(i)・Σ_i H_2^'2(i)
- 【誤】 CvChainApproxMethod method = CV_CHAIN_APPROX_SIMPLE
- 【正】 CvChainApproxMethod method = CV_CHAIN_APPROX_SIMPLE,
- 【正】 CvPoint offset = cvPoint(0,0)
- 【誤】 first=c01000←→c01001←→h0100←→c010←→c000←→h01←→h00←→c0
- 【正】 first=c01000←→c01001←→h0100←→h0000←→c010←→c000←→h01←→h00←→c0
- 【誤】
- 【正】 offsetによりすべての輪郭点はこれによってシフトされます。
- 【誤】 8方向にうちの1つの方向であること
- 【正】 8方向のうちのどの方向に対してか
- 【誤】 次の2つの引数はmethodに固有のものです(現在のところ1つだけが)
- 【正】 次の2つの引数は(現在のところ1つだけが)methodに固有のものです
- 【誤】 cvCheckContourConvexity()は判定した輪郭がすでに凸かどうか
- 【正】 cvCheckContourConvexity()は判定した輪郭が凸かどうか
- 【誤】 背景ノイズ(もしくはその片方†) ... 役立つことです。
- 【正】 背景ノイズ(もしくはその片方) ... 役立つことです†。
- 【誤】 任意のピクセルの線
- 【正】 任意の線上のピクセル
- 【誤】 cIcount
- 【正】 Icount
- 【誤】 実は、ブロッブを色空間中の箱で近似し、各軸上での範囲を学習するという、最も単純方法でもかなりうまくいきます。
- 【正】 実は、ブロッブを色空間の3つの各軸上で範囲を学習した単なるボックスに近似するという、最も単純な方法でもかなりうまくいきます。
- 【誤】 ビデオストリームの連続するフレーム内のあるフレームから所定のオブジェクトを見つけること
- 【正】 ビデオストリームのあるフレームにあった所定のオブジェクトを、その後に続くフレームから見つけること
- 【誤】 点の中である大きな変化がある点を探したいとしましょう
- 【正】 いくつかある点の中で大きな変化がある点を探したいとしましょう
- 【誤】 新しい複数の「2次微分画像」、もしくは、両方を一緒にして、新しい
- 【正】 新たな「2次微分画像群」、もしくは、すべてをまとめて、新たな
- 【誤】 (ある重みづけ係数を掛けたもの)
- 【正】 (にある重みづけ係数を掛けたもの)
- 【誤】 枝刈りか
- 【正】 枝刈りが
- 【誤】 オプションのmaskはいつもの、ブール値として解釈される画像で
- 【正】 オプションのmaskは、ブール値として解釈されるいつもの画像で
- 【誤】 トラッキングされているオブジェクトの3次元形状を再構成するためにトラッキングしている時に
- 【正】 オブジェクトの3次元形状を再構成するためにトラッキングしている時に
- 【誤】 右上に2個あるv3
- 【正】 下のv3はv4
- 【誤】 メモ
- 【正】 数式による表現
- 【誤】 最もうまく分離できるように超平面を分離することを学習する
- 【正】 最もうまく分離できる超平面を学習する
- 【誤】 Sharp Context
- 【正】 Shape Context
- 【誤】 単性度
- 【正】 単精度
正誤表 - 2010年2月掲載(3刷以降は修正済み)
■P.xvi L.10
- 【誤】http://www.oreilly.co.jp/books/9784873114170/
- 【正】http://www.oreilly.co.jp/books/9784873114132/
- 【誤】5.3.3 より汎用的なモフォロジー ………… 124
- 【正】5.3.3 より汎用的なモルフォロジー ………… 124
- 【誤】5.3.3 より汎用的なモフォロジー
- 【正】5.3.3 より汎用的なモルフォロジー
- 【誤】私たちが使用するモフォロジー演算を指定します。
- 【正】私たちが使用するモルフォロジー演算を指定します。
- 【誤】cvInitUndistortRectifyMap(&_M2,&_D1,&_R2,&_M2,mx2,my2);
- 【正】cvInitUndistortRectifyMap(&_M2,&_D2,&_R2,&_M2,mx2,my2);
正誤表 - 2010年8月掲載(4刷以降は修正済み)
■P.15 図1-6
- 【誤】Soraris
- 【正】Solaris
- 【誤】入力されなかった場合は0を返します。
- 【正】入力されなかった場合は-1を返します。
- 【誤】収縮→ 膨張→
- 【正】膨張→ 収縮→
- 【誤】spatialRadiusは2に、
- 【正】spatialRadiusは20に、
目次
日本語版に寄せて 訳者まえがき まえがき 1章 概要 1.1 OpenCVとは何か? 1.2 OpenCVを使うのはだれか? 1.3 コンピュータビジョンとは何か? 1.4 OpenCVの起源 1.4.1 IPPでOpenCVを高速化する 1.4.2 OpenCVの所有者はだれか? 1.5 OpenCVをダウンロード、インストールする 1.5.1 インストール 1.6 CVSから最新のOpenCVを入手する 1.7 その他のOpenCVドキュメント 1.7.1 HTMLで利用できるドキュメント 1.7.2 Wiki上のドキュメント 1.8 OpenCVの構造と内容 1.9 移植性 1.10 練習問題 2章 OpenCV入門 2.1 始めましょう 2.2 初めてのプログラム―写真を表示する 2.3 2つ目のプログラム―AVIビデオ 2.4 見て回る 2.5 簡単な変換 2.6 少し複雑な変換 2.7 カメラからの入力 2.8 AVIファイルへ書き込む 2.9 次の章へ 2.10 練習問題 3章 OpenCVについて知る 3.1 OpenCVの基本データ型 3.1.1 行列と画像の型 3.2 CvMat行列構造体 3.2.1 行列内のデータにアクセスする 3.2.2 点の配列 3.3 IplImageデータ構造体 3.3.1 画像データにアクセスする 3.3.2 ROIとwidthStepについての補足 3.4 行列と画像 3.4.1 行列と画像のオペレータ 3.5 描画する 3.5.1 直線 3.5.2 円と楕円 3.5.3 ポリゴン 3.5.4 フォントとテキスト 3.6 データ保管 3.7 IPP 3.7.1 インストールを検証する 3.8 まとめ 3.9 練習問題 4章 HighGUI 4.1 ポータブルなグラフィクスツールキット 4.2 ウィンドウを作成する 4.3 画像をロードする 4.4 画像を表示する 4.4.1 WaitKey(キーを待つ) 4.4.2 マウスイベント 4.4.3 スライダー、トラックバー、スイッチ 4.4.4 ボタンはない 4.5 ビデオを扱う 4.5.1 ビデオを読み込む 4.5.2 ビデオを書き出す 4.6 ConvertImage(画像を変換する) 4.7 練習問題 5章 画像処理 5.1 概要 5.2 平滑化 5.3 画像のモルフォロジー 5.3.1 膨張と収縮 5.3.2 自分のカーネルを作成する 5.3.3 より汎用的なモフォロジー 5.4 フラッドフィル 5.5 リサイズ 5.6 画像ピラミッド 5.7 閾値 5.7.1 適応型閾値 5.8 練習問題 6章 画像変換 6.1 概要 6.2 コンボリューション 6.2.1 コンボリューションの境界 6.3 勾配とSobel微分 6.3.1 Scharrフィルタ 6.4 Laplacian 6.5 Canny 6.6 Hough変換 6.6.1 Hough線変換 6.6.2 Hough円変換 6.7 写像 6.8 拡大、縮小、ワープ(歪曲)、回転 6.8.1 アフィン変換 6.8.2 透視変換 6.9 CartToPolarとPolarToCart 6.10 対数極座標(LogPolar) 6.11 離散フーリエ変換(DFT) 6.11.1 スペクトル乗算 6.11.2 コンボリューションとDFT 6.12 離散コサイン変換(DCT) 6.13 積分画像 6.14 距離変換 6.15 ヒストグラムの均一化 6.16 練習問題 7章 ヒストグラムとマッチング 7.1 基本的なヒストグラムのデータ構造 7.2 ヒストグラムにアクセスする 7.3 ヒストグラムの基本操作 7.3.1 2つのヒストグラムを比較する 7.3.2 ヒストグラムの使用例 7.4 もう少し複雑なもの 7.4.1 Earth Mover's Distance(EMD) 7.4.2 バックプロジェクション 7.4.3 テンプレートマッチング 7.5 練習問題 8章 輪郭 8.1 メモリストレージ 8.2 シーケンス 8.2.1 シーケンスを作成する 8.2.2 シーケンスを削除する 8.2.3 シーケンスの要素に直接アクセスする 8.2.4 スライス、データのコピーと移動 8.2.5 シーケンスをスタックとして使用する 8.2.6 要素の挿入と削除 8.2.7 シーケンスのブロックサイズ 8.2.8 シーケンスのリーダーとライター 8.2.9 シーケンスと配列 8.3 輪郭を見つける 8.3.1 輪郭はシーケンスである 8.3.2 Freemanチェインコード 8.3.3 輪郭を描画する 8.3.4 輪郭の例 8.4 もう1つの輪郭の例 8.5 輪郭に対してさらに何かを行う 8.5.1 ポリゴン近似 8.5.2 特徴を要約する 8.5.3 ジオメトリ 8.6 輪郭のマッチング 8.6.1 モーメント 8.6.2 モーメントの詳細 8.6.3 Huモーメントを用いてマッチングを行う 8.6.4 階層型マッチング 8.6.5 輪郭の凸部と凹状欠損 8.6.6 ペアワイズ幾何ヒストグラム 8.7 練習問題 9章 画像の部分領域と分割処理 9.1 部分領域と分割 9.2 背景除去 9.2.1 背景除去の弱点 9.2.2 シーンのモデル化 9.2.3 ピクセルの断面 9.2.4 フレーム差分 9.2.5 平均背景法 9.2.6 平均、分散、共分散を累積する 9.2.7 高度な背景手法 9.2.8 前景除去のための連結成分 9.2.9 背景手法を比較する 9.3 Watershedアルゴリズム 9.4 画像修復 9.5 平均シフト分割 9.6 Delaunay三角分割法、Voronoi図 9.6.1 DelaunayまたはVoronoiの細分割を作成する 9.6.2 Delaunayの細分割を動き回る 9.6.3 使用例 9.7 練習問題 10章 トラッキングとモーション 10.1 トラッキングの基礎 10.2 コーナー検出 10.3 サブピクセルコーナー 10.4 不変特徴量 10.5 オプティカルフロー 10.5.1 Lucas-Kanade法 10.5.2 密なトラッキングテクニック 10.6 平均値シフトとcamshiftトラッキング 10.6.1 平均値シフト 10.6.2 camshift 10.7 モーションテンプレート 10.8 推定器 10.8.1 Kalmanフィルタ 10.8.2 拡張Kalmanフィルタに関する簡単な説明 10.9 Condensationアルゴリズム 10.10 練習問題 11章 カメラモデルとキャリブレーション 11.1 カメラモデル 11.1.1 射影幾何の基本 11.1.2 レンズ歪み 11.2 キャリブレーション 11.2.1 回転行列と平行移動ベクトル 11.2.2 チェスボード 11.2.3 ホモグラフィ 11.2.4 カメラキャリブレーション 11.3 歪み補正 11.4 キャリブレーションを全部まとめる 11.5 Rodrigues変換 11.6 練習問題 12章 投影と3Dビジョン 12.1 投影 12.2 アフィン変換と透視変換 12.2.1 鳥瞰図変換の例 12.3 POSIT:3D姿勢推定 12.4 ステレオ画像処理 12.4.1 三角測量 12.4.2 エピポーラ幾何 12.4.3 基本行列と基礎行列 12.4.4 エピポーラ線を計算する 12.4.5 ステレオキャリブレーション 12.4.6 ステレオ平行化 12.4.7 ステレオ対応点探索 12.4.8 ステレオキャリブレーション、平行化、対応点探索のコード 12.4.9 3D再投影からの奥行きマップ 12.5 動画像からの3次元復元 12.6 2次元と3次元の線のフィッティング処理 12.7 練習問題 13章 機械学習 13.1 機械学習とは 13.1.1 学習セットとテストセット 13.1.2 教師つきデータと教師なしデータ 13.1.3 生成的モデルと識別的モデル 13.1.4 OpenCVのMLアルゴリズム 13.1.5 ビジョンで機械学習を使う 13.1.6 変数の重要度 13.1.7 機械学習の問題を診断する 13.2 MLライブラリの共通ルーチン 13.2.1 学習 13.2.2 予測 13.2.3 学習の繰り返しを制御する 13.3 マハラノビス距離 13.4 K-means 13.4.1 問題と解決策 13.4.2 K-meansのコード 13.5 単純Bayes分類器 13.5.1 単純Bayesのコード 13.6 二分決定木 13.6.1 回帰の不純さ 13.6.2 分類の不純さ 13.6.3 決定木の使い方 13.6.4 決定木の結果 13.7 ブースティング 13.7.1 AdaBoost 13.7.2 ブースティングのコード 13.8 ランダムツリー 13.8.1 ランダムツリーのコード 13.8.2 ランダムツリーを使う 13.9 顔検出器/Haar分類器 13.9.1 教師あり学習とブースティング理論 13.9.2 Viola-Jones分類器の理論 13.9.3 顔検出器のコード 13.9.4 新しいオブジェクトを学習する 13.10 他の機械学習アルゴリズム 13.10.1 期待値最大化 13.10.2 K近傍 13.10.3 多層パーセプトロン 13.10.4 サポートベクトルマシン 13.11 練習問題 14章 OpenCVの未来 14.1 過去と未来 14.2 方向性 14.2.1 具体的な項目 14.3 アーティストのためのOpenCV 14.4 あとがき 付録A iPhone OSへのOpenCV/FaceDetectionの移植と高速化 A.1 iPhoneへのOpenCV移植と最適化準備 A.1.1 iPhoneのハードウェア/ソフトウェア構成について A.1.2 iPhoneへの移植作業 A.1.3 プロファイリング環境の構築 A.1.4 ボトルネックの特定 A.2 最適化実践 A.2.1 コンパイルオプションの調整 A.2.2 ハイレベルなコード変更による最適化 A.2.3 ディープなコード変更による最適化 A.2.4 今後の課題 A.3 参考文献 付録B Webカメラを使って手や物体を感知するディスプレイを作ろう B.1 カメラとディスプレイを使って装置を構成する B.2 カメラとディスプレイのキャリブレーション B.3 レーザー水平器を使ったマルチタッチディスプレイ B.3.1 レーザー水平器を用いた指の接触判定 B.3.2 ヒストグラムを使った手領域の抽出 B.3.3 レーザー水平器を使ったマルチタッチディスプレイの アプリケーション例 B.4 偏光板を応用したディスプレイシステム B.4.1 偏光板を使ってディスプレイ上の物体を簡単に抽出する B.4.2 物体の抽出と形状認識を行うプログラム B.4.3 偏光板を応用したディスプレイシステムのアプリケーション例 B.5 参考文献 付録C OpenCVインストールガイド 共通の動作環境 追加の動作環境(Linux、BSD、その他のUNIXライクなシステム) SourceForge SVNリポジトリから最新のOpenCVを取得する CMakeを使ってソースからOpenCVをビルドする(クロスプラットフォーム) autotoolsを使ってOpenCVをビルドする (Linux、Mac OS X、その他のUNIXライクなシステム) OpenCVをテストする(CMake、クロスプラットフォーム) OpenCVをテストする(autotools) Python/Octaveラッパーをテストする OpenCVを使った自身のコードをビルドする ARMに関する注意 付録D 参考文献 索引