詳解 OpenCV 3

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

[cover photo]
TOPICS
Programming , C/C++
発行年月日
PRINT LENGTH
992
ISBN
978-4-87311-837-6
原書
Learning OpenCV 3
FORMAT
Print PDF EPUB
Ebook
7,480円
Ebookを購入する
Print
7,480円

OpenCVの開発者によるベストセラー書の改訂版。最新のC++インタフェースに対応。OpenCVは現在、ロボットの視覚システムだけでなくスマホやパソコンの顔認証、画像アプリやセキュリティ監視の人物検出、製造、医療、自動運転車、ゲームやARアプリ、さらには機械学習に代表される人工知能の研究など、さまざまな分野で利用されています。本書では、カメラ入力やファイル出力といった簡単な使い方から、画像の変換やセグメンテーション、テンプレートマッチング、パターン認識、特徴量、物体や動きのトラッキング、ステレオビジョンからの3Dの再構成、機械学習まで、基礎から丁寧かつ詳細に解説します。関数のリファレンスとしても利用可能です。

関連ファイル

目次

目次

訳者まえがき
まえがき

1章 概要
    1.1 OpenCVとは何か?
    1.2 OpenCVを使うのはだれか?
    1.3 コンピュータビジョンとは何か?
    1.4 OpenCVの起源
        1.4.1 OpenCVのブロック図
        1.4.2 IPPでOpenCVを高速化する
        1.4.3 OpenCVの所有者はだれか?
    1.5 OpenCVをダウンロード、インストールする
        1.5.1 インストール
    1.6 Gitから最新のOpenCVを入手する
    1.7 その他のOpenCVドキュメント
        1.7.1 同梱のドキュメント
        1.7.2 オンラインドキュメントとWiki
    1.8 OpenCVの寄贈リポジトリ
        1.8.1 寄贈コードのモジュールをダウンロードしビルドする
    1.9 移植性
    1.10 まとめ
    1.11 練習問題

2章 OpenCV入門
    2.1 インクルードファイル
        2.1.1 リソース
    2.2 初めてのプログラム――写真を表示する
    2.3 2つ目のプログラム――動画
    2.4 動き回る
    2.5 簡単な変換
    2.6 少し複雑な変換
    2.7 カメラからの入力
    2.8 AVIファイルへ書き込む
    2.9 まとめ
    2.10 練習問題

3章 OpenCVのデータ型
    3.1 基本
    3.2 OpenCVのデータ型
        3.2.1 基本の型の概要
        3.2.2 基本の型:深く掘り下げる
        3.2.3 ヘルパーオブジェクト
        3.2.4 ユーティリティ関数
        3.2.5 テンプレート構造
    3.3 まとめ
    3.4 練習問題

4章 画像と大型配列型
    4.1 動的可変長ストレージ
        4.1.1 cv::Matクラス:N次元の密な配列
        4.1.2 配列の生成
        4.1.3 個々の配列要素へのアクセス
        4.1.4 N変数配列イテレータ:cv::NAryMatIterator
        4.1.5 ブロック単位での配列要素へのアクセス
        4.1.6 行列の演算式:代数とcv::Mat
        4.1.7 飽和型変換
        4.1.8 その他、配列でできること
        4.1.9 cv::SparseMatクラス:疎な配列
        4.1.10 疎な配列の要素へのアクセス
        4.1.11 疎な配列に特有の機能
        4.1.12 大型配列型用のテンプレート形式
    4.2 まとめ
    4.3 練習問題

5章 配列の演算
    5.1 配列でできる多様な処理
        5.1.1 cv::abs()
        5.1.2 cv::absdiff()
        5.1.3 cv::add()
        5.1.4 cv::addWeighted()
        5.1.5 cv::bitwise_and()
        5.1.6 cv::bitwise_not()
        5.1.7 cv::bitwise_or()
        5.1.8 cv::bitwise_xor()
        5.1.9 cv::calcCovarMatrix()
        5.1.10 cv::cartToPolar()
        5.1.11 cv::checkRange()
        5.1.12 cv::compare()
        5.1.13 cv::completeSymm()
        5.1.14 cv::convertScaleAbs()
        5.1.15 cv::countNonZero()
        5.1.16 cv::cvarrToMat()
        5.1.17 cv::dct()
        5.1.18 cv::dft()
        5.1.19 cv::cvtColor()
        5.1.20 cv::determinant()
        5.1.21 cv::divide()
        5.1.22 cv::eigen()
        5.1.23 cv::exp()
        5.1.24 cv::extractImageCOI()
        5.1.25 cv::flip()
        5.1.26 cv::gemm()
        5.1.27 cv::getConvertElem()とcv::getConvertScaleElem()
        5.1.28 cv::idct()
        5.1.29 cv::idft()
        5.1.30 cv::inRange()
        5.1.31 cv::insertImageCOI()
        5.1.32 cv::invert()
        5.1.33 cv::log()
        5.1.34 cv::LUT()
        5.1.35 cv::magnitude()
        5.1.36 cv::Mahalanobis()
        5.1.37 cv::max()
        5.1.38 cv::mean()
        5.1.39 cv::meanStdDev()
        5.1.40 cv::merge()
        5.1.41 cv::min()
        5.1.42 cv::minMaxIdx()
        5.1.43 cv::minMaxLoc()
        5.1.44 cv::mixChannels()
        5.1.45 cv::mulSpectrums()
        5.1.46 cv::multiply()
        5.1.47 cv::mulTransposed()
        5.1.48 cv::norm()
        5.1.49 cv::normalize()
        5.1.50 cv::perspectiveTransform()
        5.1.51 cv::phase()
        5.1.52 cv::polarToCart()
        5.1.53 cv::pow()
        5.1.54 cv::randu()
        5.1.55 cv::randn()
        5.1.56 cv::randShuffle()
        5.1.57 cv::reduce()
        5.1.58 cv::repeat()
        5.1.59 cv::scaleAdd()
        5.1.60 cv::setIdentity()
        5.1.61 cv::solve()
        5.1.62 cv::solveCubic()
        5.1.63 cv::solvePoly()
        5.1.64 cv::sort()
        5.1.65 cv::sortIdx()
        5.1.66 cv::split()
        5.1.67 cv::sqrt()
        5.1.68 cv::subtract()
        5.1.69 cv::sum()
        5.1.70 cv::trace()
        5.1.71 cv::transform()
        5.1.72 cv::transpose()
    5.2 まとめ
    5.3 練習問題

6章 描画方法とテキスト表示方法
    6.1 図形を描画する
        6.1.1 線画とポリゴンの塗りつぶし
        6.1.2 フォントとテキスト
    6.2 まとめ
    6.3 練習問題

7章 OpenCVのファンクタ
    7.1 「何かをする」オブジェクト
        7.1.1 主成分分析(cv::PCA)
        7.1.2 特異値分解(cv::SVD)
        7.1.3 乱数生成器(cv::RNG)
    7.2 まとめ
    7.3 練習問題

8章 画像、動画、データファイル
    8.1 HighGUI:ポータブルなグラフィックスツールキット
    8.2 画像ファイルを扱う
        8.2.1 画像を読み込む、書き込む
        8.2.2 コーデックに関する注意
        8.2.3 圧縮と展開
    8.3 動画を扱う
        8.3.1 cv::VideoCaptureオブジェクトを用いて動画を読み込む
        8.3.2 cv::VideoWriterオブジェクトを用いて動画を書き出す
    8.4 データの保存
        8.4.1 cv::FileStorageに書き込む
        8.4.2 cv::FileStorageから読み込む
        8.4.3 cv::FileNode
    8.5 まとめ
    8.6 練習問題

9章 クラスプラットフォームとネイティブウィンドウ
    9.1 ウィンドウで作業する
        9.1.1 HighGUIネイティブのグラフィカルユーザーインタフェース
        9.1.2 Qtバックエンドで作業する
        9.1.3 OpenCVと他のGUIツールキットを統合する
    9.2 まとめ
    9.3 練習問題

10章 フィルタとコンボリューション
    10.1 概要
    10.2 始める前に
        10.2.1 フィルタ、カーネル、コンボリューション
        10.2.2 境界線の外挿と境界条件
    10.3 閾値処理
        10.3.1 大津のアルゴリズム
        10.3.2 適応型閾値処理
    10.4 平滑化
        10.4.1 単純平滑化とボックスフィルタ
        10.4.2 メディアンフィルタ
        10.4.3 Gaussianフィルタ
        10.4.4 バイラテラルフィルタ
    10.5 微分と勾配
        10.5.1 Sobel微分
        10.5.2 Scharrフィルタ
        10.5.3 Laplacian
    10.6 画像のモルフォロジー
        10.6.1 膨張と収縮
        10.6.2 汎用的なモルフォロジー関数
        10.6.3 オープニングとクロージング
        10.6.4 モルフォロジーの勾配演算
        10.6.5 トップハットとブラックハット
        10.6.6 自前のカーネルを作成する
    10.7 任意の線形フィルタによるコンボリューション
        10.7.1 cv::filter2D()を用いて汎用フィルタを適用する
        10.7.2 cv::sepFilter2D()を用いて汎用的な分離可能フィルタを適用する
        10.7.3 カーネルを作る
    10.8 まとめ
    10.9 練習問題

11章 画像変換
    11.1 概要
    11.2 拡大、縮小、ワープ(歪曲)、回転
        11.2.1 均一なリサイズ
        11.2.2 画像ピラミッド
        11.2.3 不均一写像
        11.2.4 アフィン変換
        11.2.5 透視変換
    11.3 汎用的な写像
        11.3.1 極座標変換
        11.3.2 対数極座標(LogPolar)
        11.3.3 任意の写像
    11.4 画像修復
        11.4.1 修復
        11.4.2 ノイズ除去
    11.5 ヒストグラムの平坦化
        11.5.1 cv::equalizeHist():コントラストの平坦化
    11.6 まとめ
    11.7 練習問題

12章 画像解析
    12.1 概要
    12.2 離散フーリエ変換
        12.2.1 cv::dft():離散フーリエ変換
        12.2.2 cv::idft():逆離散フーリエ変換
        12.2.3 cv::mulSpectrums():スペクトル乗算
        12.2.4 DFTを用いたコンボリューション
        12.2.5 cv::dct():離散コサイン変換
        12.2.6 cv::idct():逆離散コサイン変換
    12.3 積分画像
        12.3.1 標準の積分計算用のcv::integral()
        12.3.2 二乗和積分用のcv::integral()
        12.3.3 傾斜和積分用のcv::integral()
    12.4 Cannyエッジ検出器
        12.4.1 cv::Canny()
    12.5 Hough変換
        12.5.1 Hough線変換
        12.5.2 Hough円変換
    12.6 距離変換
        12.6.1 ラベルなし距離変換用のcv::distanceTransform()
        12.6.2 ラベル付き距離変換用のcv::distanceTransform()
    12.7 領域分割
        12.7.1 フラッドフィル処理
        12.7.2 Watershedアルゴリズム
        12.7.3 Grabcuts
        12.7.4 平均値シフト分割
    12.8 まとめ
    12.9 練習問題

13章 ヒストグラムとテンプレートマッチング
    13.1 OpenCVでのヒストグラムの表現
        13.1.1 cv::calcHist():データからヒストグラムを作成する
    13.2 ヒストグラムの基本操作
        13.2.1 ヒストグラムの正規化
        13.2.2 ヒストグラムの閾値
        13.2.3 最も値の大きいビンを見つける
        13.2.4 2つのヒストグラムを比較する
        13.2.5 ヒストグラムの使用例
    13.3 もう少し洗練されたヒストグラムの手法
        13.3.1 EMD(搬土距離)
        13.3.2 バックプロジェクション
    13.4 テンプレートマッチング
        13.4.1 二乗差分マッチング手法(cv::TM_SQDIFF)
        13.4.2 正規化二乗差分マッチング手法(cv::TM_SQDIFF_NORMED)
        13.4.3 相互相関マッチング手法(cv::TM_CCORR)
        13.4.4 正規化相互相関マッチング手法(cv::TM_CCORR_NORMED)
        13.4.5 相関係数マッチング手法(cv::TM_CCOEFF)
        13.4.6 正規化相関係数マッチング手法(cv::TM_CCOEFF_NORMED)
    13.5 まとめ
    13.6 練習問題

14章 輪郭
    14.1 輪郭を見つける
        14.1.1 輪郭の階層
        14.1.2 輪郭を描画する
        14.1.3 輪郭の例
        14.1.4 もう1つの輪郭の例
        14.1.5 高速な連結成分の解析
    14.2 輪郭に対してさらに何かを行う
        14.2.1 ポリゴン近似
        14.2.2 幾何形状と特徴の要約
        14.2.3 幾何形状的な調査
    14.3 輪郭と画像をマッチングする
        14.3.1 モーメント
        14.3.2 モーメントの詳細
        14.3.3 Hu不変モーメントを用いてマッチングを行う
        14.3.4 Shape Contextを用いて形状を比較する
    14.4 まとめ
    14.5 練習問題

15章 背景除去
    15.1 背景除去の概要
    15.2 背景除去の弱点
    15.3 シーンのモデル化
        15.3.1 ピクセル集合の断面
        15.3.2 フレーム差分
    15.4 平均背景法
        15.4.1 平均、分散、共分散を累積する
    15.5 より高度な背景除去手法
        15.5.1 クラス
        15.5.2 背景を学習する
        15.5.3 動く前景の物体も含めて学習する
        15.5.4 背景差分:前景物体を見つける
        15.5.5 コードブック背景モデルを使う
        15.5.6 コードブックモデルに対するさらなる考察
    15.6 前景除去のための連結成分
        15.6.1 クイックテスト
    15.7 背景手法を比較する
    15.8 OpenCVの背景除去のカプセル化
        15.8.1 cv::BackgroundSubtractor基底クラス
        15.8.2 KaewTraKulPong and Bowdenの手法
        15.8.3 Zivkovic法
    15.9 まとめ
    15.10 練習問題

16章 キーポイントと記述子
    16.1 キーポイントとトラッキングの基礎
        16.1.1 コーナー検出
        16.1.2 オプティカルフローの概要
        16.1.3 Lucas-Kanade法による疎なオプティカルフロー
    16.2 一般化されたキーポイントと記述子
        16.2.1 オプティカルフロー、追跡、認識
        16.2.2 OpenCVによるキーポイントと記述子の一般的なケースにおける扱い方
        16.2.3 キーポイント検出手法
        16.2.4 キーポイントのフィルタ処理
        16.2.5 マッチングメソッド
        16.2.6 結果を表示する
    16.3 まとめ
    16.4 練習問題

17章 トラッキング
    17.1 トラッキングの概念
    17.2 密なオプティカルフロー
        17.2.1 Farnebäckの多項式展開アルゴリズム
        17.2.2 Dual TV-L1アルゴリズム
        17.2.3 Simple Flowアルゴリズム
    17.3 平均値シフトとCamshiftトラッキング
        17.3.1 平均値シフト
        17.3.2 Camshiftアルゴリズム
    17.4 モーションテンプレート
    17.5 推定器
        17.5.1 Kalmanフィルタ
        17.5.2 拡張 Kalmanフィルタに関する簡単な説明
    17.6 まとめ
    17.7 練習問題

18章 カメラモデルとキャリブレーション
    18.1 カメラモデル
        18.1.1 射影幾何の基本
        18.1.2 ロドリゲス変換
        18.1.3 レンズ歪み
    18.2 キャリブレーション
        18.2.1 回転行列と平行移動ベクトル
        18.2.2 キャリブレーションボード
        18.2.3 ホモグラフィ
        18.2.4 カメラキャリブレーション
    18.3 歪み補正
        18.3.1 歪み補正マップ
        18.3.2 cv::convertMaps()を用いて歪み補正マップの表現を変換する
        18.3.3 cv::initUndistortRectifyMap()を用いて歪み補正マップを計算する
        18.3.4 cv::remap()を用いて画像の歪み補正を行う
        18.3.5 cv::undistort()を用いて歪み補正を行う
        18.3.6 cv::undistortPoints()を用いて疎な歪み補正を行う
    18.4 キャリブレーションを全部まとめる
    18.5 まとめ
    18.6 練習問題

19章 射影変換と3次元ビジョン
    19.1 射影
    19.2 アフィン変換と透視変換
        19.2.1 鳥瞰図変換の例
    19.3 3次元姿勢推定
        19.3.1 単一カメラによる姿勢推定
        19.3.2 cv::solvePnP()を用いて既知の物体の姿勢を計算する
    19.4 ステレオ画像処理
        19.4.1 三角測量
        19.4.2 エピポーラ幾何
        19.4.3 基本行列と基礎行列
        19.4.4 エピポーラ線を計算する
        19.4.5 ステレオキャリブレーション
        19.4.6 ステレオ平行化
        19.4.7 ステレオ対応点探索
        19.4.8 ステレオキャリブレーション、平行化、対応点探索のコード例
        19.4.9 3次元再投影からの奥行きマップ
    19.5 動画像からの3次元復元
    19.6 2次元と3次元の線のフィッティング処理
    19.7 まとめ
    19.8 練習問題

20章 OpenCVによる機械学習の基本
    20.1 機械学習とは?
        20.1.1 訓練セットとテストセット
        20.1.2 教師あり学習と教師なし学習
        20.1.3 生成的モデルと識別的モデル
        20.1.4 OpenCVのMLアルゴリズム
        20.1.5 機械学習をビジョンで使う
        20.1.6 変数の重要度
        20.1.7 機械学習の問題を診断する
    20.2 MLライブラリの古い関数群
        20.2.1 K-means法
        20.2.2 Mahalanobis距離
    20.3 まとめ
    20.4 練習問題

21章 StatModelクラス:OpenCVの学習標準モデル
    21.1 MLライブラリの共通ルーチン
        21.1.1 訓練とcv::ml::TrainDataクラス
        21.1.2 予測
    21.2 cv::ml::StatModelを用いた機械学習アルゴリズム
        21.2.1 単純/ノーマルベイズ分類器
        21.2.2 二分決定木
        21.2.3 ブースティング
        21.2.4 ランダムツリー
        21.2.5 期待値最大化
        21.2.6 K近傍法
        21.2.7 多層パーセプトロン
        21.2.8 サポートベクタマシン
    21.3 まとめ
    21.4 練習問題

22章 物体検出
    22.1 木構造に基づく物体検出テクニック
        22.1.1 カスケード分類器
        22.1.2 教師あり学習とブースティングの理論
        22.1.3 新しい物体を学習する
    22.2 サポートベクタマシンによる物体検出
        22.2.1 物体検出のためのLatent SVM
        22.2.2 Bag of Wordsアルゴリズムと意味カテゴリ化
    22.3 まとめ
    22.4 練習問題

23章 OpenCVの今後
    23.1 過去と現在
        23.1.1 OpenCV 3.x
    23.2 前回の予言はどれくらいうまくいったか?
    23.3 将来の機能
        23.3.1 現在のGSoCの成果
    23.4 コミュニティからの貢献
        23.4.1 OpenCV.org
    23.5 AIに関する思索
    23.6 あとがき

付録A 平面分割
    A.1 ドロネー三角形分割、ボロノイ分割
        A.1.1 ドロネーまたはボロノイ細分割区分の生成
        A.1.2 ドロネーの細分割区分を動き回る
        A.1.3 外側の三角形または凸包上の辺を特定し、凸包上を歩く
        A.1.4 使用例
    A.2 練習問題

付録B opencv_contribモジュール
    B.1 opencv_contribモジュールの概説
        B.1.1 opencv_contribの内容

付録C キャリブレーションパターン
    C.1 OpenCVで使われるキャリブレーションパターン

参考文献
索引