詳解 OpenCV

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

[cover photo]
TOPICS
Programming , C/C++
発行年月日
PRINT LENGTH
640
ISBN
978-4-87311-413-2
原書
Learning OpenCV
FORMAT
PDF
Print
5,060円
この商品は品切れ再入荷未定です

コンピュータビジョンについての解説書。コンピュータが「目」を持ち、情報に基づいて意思決定することが可能なアプリケーションをどう開発するかについて、OpenCVの開発者であるGary Bradski氏が詳しく解説します。本書を読めば、研究者や開発者も電子ホビーストもOpenCVが提供するフレームワークの使い方を身につけてすぐに活用できます。シンプルなものから最新鋭のものまでさまざまなビジョンアプリケーションを作ることができるようになるでしょう。日本語版では巻末付録として、OpenCV高速化テクニック、Webカメラで手や物体を感知するディスプレイの作成方法について加筆しました。

関連ファイル

正誤表

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

正誤表 - 2009年10月掲載(2刷以降は修正済み)

■P.2 L.5(下から)
  • 【誤】 静止カメラ
  • 【正】 デジタルスチルカメラ
■P.2 L.1(下から)
  • 【誤】 決定は、「このシーンに ... 」
  • 【正】 決定したいことは、「このシーンに ... 」
■P.3 L.6(下から)
  • 【誤】 マシンビジョンシステムでは
  • 【正】 機械によるビジョンシステムでは
■P.12 L.10(下から)
  • 【誤】 Machin Learning
  • 【正】 Machine Learning
■P.14 L.3
  • 【誤】 ML
  • 【正】 MLL
■P.46 L.16
  • 【誤】 パッケージされたルーチンがライブラリにはないような処理
  • 【正】 あらかじめパッケージ化されたルーチンがライブラリにはないような処理
■P.47 L.8
  • 【誤】 imageDataポインタはバイトポインタ(uchar *)です。指されているデータは必ずしもuchar型
  • 【正】 imageDataポインタはバイトポインタ(char *)です。指されているデータは必ずしもchar型
■P.47 下脚注
  • 【誤】 COI(注目カラーチャンネル)
  • 【正】 COI(注目チャンネル)
■P.48 L.16
  • 【誤】 cvSetImage ROI(src, cvRect(x,y,width,height));
  • 【正】 cvSetImageROI(src, cvRect(x,y,width,height));
■P.54 L.54
  • 【誤】 cvSetImage ROI(src1, cvRect(x,y,width,height));
  • 【正】 cvSetImageROI(src1, cvRect(x,y,width,height));
■P.56 L.13 表3-4
  • 【誤】 出力共分散行列
  • 【正】 出力される共分散行列
■P.59 L.12
  • 【誤】 最後にデータ型変換を実行します
  • 【正】 最後にデータの型変換を実行します
■P.59 L.20 ※脚注を追加
  • 【誤】 疎な配列も同様に
  • 【正】 疎な配列†も同様に
  • 【正】 †訳注:要素の一部しか定義されていない行列。OpenCVでは疎な配列用にCvSparseMat型が用意されている。
■P.63 L.1
  • 【誤】 maskがNULLでない場合この関数は、maskの0の要素に対応するdstの要素は変更しません。
  • 【正】 scaleが1以外の場合、dstの各要素はscaleを乗算されます。
■P.65 L.20
  • 【誤】 このようなヘッダの修正には、メモリの確保やデータのコピーは含まれないことに注意することが大切です。
  • 【正】 注意してほしいのは、このようなヘッダの修正ではヘッダだけが修正され、メモリを確保したりデータがコピーしたりはしないというこです。
■P.66 脚注
  • 【誤】 OpenCVでは、「ベクトル」はサイズがn×1か1×nの行列と見なしていることを
  • 【正】 OpenCVでは「ベクトル」を、サイズがn×1か1×nの行列と見なしていることを
■P.71 L.20
  • 【誤】 maskがNULLでない場合、この関数は、maskの0の要素に対応するdstの要素はどれも変更しません。
  • 【正】 scaleが1以外の場合、dstの各要素はscaleを乗算されます。
■P.83 L.16(下から)
  • 【誤】 追加のセグメントが
  • 【正】 追加の線分が
■P.86 L.22
  • 【誤】 サイズはいくつか(320×240)
  • 【正】 サイズはいくつか(320×200)
■P.104 L.1
  • 【誤】 ありせん
  • 【正】 ありません
■P.114 表5-1 ※「CV_BLUR」と「CV_BLUR_NO_SCALE」の「チャンネル数」
  • 【誤】 1,3
  • 【正】 1〜4
■P.114 表5-1 ※「CV_MEDIAN」の「チャンネル数」
  • 【誤】 1,3
  • 【正】 1,3,4
■P.114 表5-1 ※「CV_GAUSSIAN」の「dstの深さ」
  • 【誤】 32f 8u
  • 【正】 8u
■P.118 L.1(下から)
  • 【誤】 図5-5 バイラテラル平滑化の結果
  • 【正】 図5-5 バイラテラル平滑化
■P.130 図5-18
  • 【誤】 Θ
  • 【正】 ○に−
■P.135 L.19
  • 【誤】 PyrUp()がPyrDown() ... これはPyrDown()が
  • 【正】 cvPyrUpがcvPyrDown() ... これはcvPyrDown()が
■P.135 L.5(下から)
  • 【誤】 PyrUp()オペレータの
  • 【正】 cvPyrUp()オペレータの
■P.135 L.3(下から)の数式
  • 【誤】 PyrUp(Gi+1)
  • 【正】 cvPyrUp(Gi+1)
■P.159 L.7
  • 【誤】 パラメータ分解能
  • 【正】 パラメータの分解能
■P.171 L.3(下から)
  • 【誤】 srcは3次元の配列で
  • 【正】 srcは3チャンネルの配列で
■P.174 L.11
  • 【誤】 投影は2次元から2次元になる、
  • 【正】 投影は2次元から2次元になり、
■P.178 L.12
  • 【誤】 FILL_OUTLIERS(未定義となる点を塗りつぶす)
  • 【正】 FILL_OUTLIERS(未定義となる点を0で塗りつぶす)
■P.183 L.20(下から)
  • 【誤】 onzero_rowsパラメータ
  • 【正】 nonzero_rowsパラメータ
■P.184 L.8(下から)の数式
  • 【誤】 √n=
  • 【正】 √C_n= ※「n」は下付き文字
■P.184 L.8(下から)の数式 ※cosの()の中の分母
  • 【誤】 N
  • 【正】 2N
■P.185 L.2(下から)の数式
  • 【誤】 (image(x,y))^2
  • 【正】 image(x,y)
■P.186 L.3の数式
  • 【誤】 tilt_sum
  • 【正】 tiled_sum
■P.195 L.3
  • 【誤】 オブジェクトの位置についての説を
  • 【正】 オブジェクトの位置についての仮説を
■P.203 L.8(下から)
  • 【誤】 と呼んでください
  • 【正】 と読んでください
■P.204 「7.3.1.1相関」の数式の分母
  • 【誤】 √Σ_i H_1^'2(i)・H_2^'2(i)
  • 【正】 √Σ_i H_1^'2(i)・Σ_i H_2^'2(i)
■P.239 L.7
  • 【誤】 CvChainApproxMethod method = CV_CHAIN_APPROX_SIMPLE
  • 【正】 CvChainApproxMethod method = CV_CHAIN_APPROX_SIMPLE,
  • 【正】 CvPoint offset = cvPoint(0,0)
■P.240 図8-3(CV_RETR_LIST)
  • 【誤】 first=c01000←→c01001←→h0100←→c010←→c000←→h01←→h00←→c0
  • 【正】 first=c01000←→c01001←→h0100←→h0000←→c010←→c000←→h01←→h00←→c0
■P.241 L.11 ※8.3.1節の前に1行追加
  • 【誤】
  • 【正】 offsetによりすべての輪郭点はこれによってシフトされます。
■P.243 L.5
  • 【誤】 8方向にうちの1つの方向であること
  • 【正】 8方向のうちのどの方向に対してか
■P.248 L.9(下から)
  • 【誤】 次の2つの引数はmethodに固有のものです(現在のところ1つだけが)
  • 【正】 次の2つの引数は(現在のところ1つだけが)methodに固有のものです
■P.262 L.8(下から)
  • 【誤】 cvCheckContourConvexity()は判定した輪郭がすでに凸かどうか
  • 【正】 cvCheckContourConvexity()は判定した輪郭が凸かどうか
■P.265 L.14,13(下から)
  • 【誤】 背景ノイズ(もしくはその片方†) ... 役立つことです。
  • 【正】 背景ノイズ(もしくはその片方) ... 役立つことです†。
■P.270 L.1
  • 【誤】 任意のピクセルの線
  • 【正】 任意の線上のピクセル
■P.275 L.4(下から)
  • 【誤】 cIcount
  • 【正】 Icount
■P.281 L.13
  • 【誤】 実は、ブロッブを色空間中の箱で近似し、各軸上での範囲を学習するという、最も単純方法でもかなりうまくいきます。
  • 【正】 実は、ブロッブを色空間の3つの各軸上で範囲を学習した単なるボックスに近似するという、最も単純な方法でもかなりうまくいきます。
■P.321 L.6
  • 【誤】 ビデオストリームの連続するフレーム内のあるフレームから所定のオブジェクトを見つけること
  • 【正】 ビデオストリームのあるフレームにあった所定のオブジェクトを、その後に続くフレームから見つけること
■P.322 L.14(下から)
  • 【誤】 点の中である大きな変化がある点を探したいとしましょう
  • 【正】 いくつかある点の中で大きな変化がある点を探したいとしましょう
■P.322 L.3(下から)
  • 【誤】 新しい複数の「2次微分画像」、もしくは、両方を一緒にして、新しい
  • 【正】 新たな「2次微分画像群」、もしくは、すべてをまとめて、新たな
■P.323 L.13(下から)
  • 【誤】 (ある重みづけ係数を掛けたもの)
  • 【正】 (にある重みづけ係数を掛けたもの)
■P.324 L.15(下から)
  • 【誤】 枝刈りか
  • 【正】 枝刈りが
■P.324 L.13(下から)
  • 【誤】 オプションのmaskはいつもの、ブール値として解釈される画像で
  • 【正】 オプションのmaskは、ブール値として解釈されるいつもの画像で
■P.325 L.14
  • 【誤】 トラッキングされているオブジェクトの3次元形状を再構成するためにトラッキングしている時に
  • 【正】 オブジェクトの3次元形状を再構成するためにトラッキングしている時に
■P.327 図10-3
  • 【誤】 右上に2個あるv3
  • 【正】 下のv3はv4
■P.332 図10-7
  • 【誤】 メモ
  • 【正】 数式による表現
■P.471 L.4(下から)
  • 【誤】 最もうまく分離できるように超平面を分離することを学習する
  • 【正】 最もうまく分離できる超平面を学習する
■P.535 L.18(特徴量)
  • 【誤】 Sharp Context
  • 【正】 Shape Context
■P.547 L.1,12(2箇所)
  • 【誤】 単性度
  • 【正】 単精度

正誤表 - 2010年2月掲載(3刷以降は修正済み)

■P.xvi L.10
  • 【誤】http://www.oreilly.co.jp/books/9784873114170/
  • 【正】http://www.oreilly.co.jp/books/9784873114132/
■P.xxii L.12
  • 【誤】5.3.3 より汎用的なモフォロジー ………… 124
  • 【正】5.3.3 より汎用的なモルフォロジー ………… 124
■P.124 5.3.3節
  • 【誤】5.3.3 より汎用的なモフォロジー
  • 【正】5.3.3 より汎用的なモルフォロジー
■P.124 表5-3の上の行
  • 【誤】私たちが使用するモフォロジー演算を指定します。
  • 【正】私たちが使用するモルフォロジー演算を指定します。
■P.458 L.19(下から)
  • 【誤】cvInitUndistortRectifyMap(&_M2,&_D1,&_R2,&_M2,mx2,my2);
  • 【正】cvInitUndistortRectifyMap(&_M2,&_D2,&_R2,&_M2,mx2,my2);

正誤表 - 2010年8月掲載(4刷以降は修正済み)

■P.15 図1-6
  • 【誤】Soraris
  • 【正】Solaris
■P.98 「4.4.1 WaitKey」の4行目
  • 【誤】入力されなかった場合は0を返します。
  • 【正】入力されなかった場合は-1を返します。
■P.125 図5-11
  • 【誤】収縮→ 膨張→
  • 【正】膨張→ 収縮→
■P.302 下から4行目
  • 【誤】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 参考文献
索引