OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
リマッピング

前のチュートリアル: 一般化BallardおよびGuilハフ変換による物体検出
次のチュートリアル: アフィン変換

原著者Ana Huamán
互換性OpenCV >= 3.0

目標

このチュートリアルでは、以下の方法を学ぶ:

a. OpenCVの関数 cv::remap を使い、単純なリマッピング処理を実装する。

理論

リマッピングとは何か?

  • リマッピングとは、画像のある位置からピクセルを取り出し、新しい画像上の別の位置に配置する処理である。
  • マッピング処理を行うには、ソース画像とデスティネーション画像の間で常に1対1のピクセル対応があるとは限らないため、非整数のピクセル位置に対して補間を行う必要が生じる場合がある。
  • すべてのピクセル位置 \((x,y)\) に対するリマッピングは、次のように表せる。

    \[g(x,y) = f ( h(x,y) )\]

    ここで \(g()\) はリマップ後の画像、\(f()\) はソース画像、\(h(x,y)\) は \((x,y)\) に作用するマッピング関数である。

  • 簡単な例で考えてみよう。画像 \(I\) があり、次のようなリマッピングを行いたいとする。

    \[h(x,y) = (I.cols - x, y )\]

    何が起こるだろうか? 画像が \(x\) 方向に反転することが容易に分かる。例として、次の入力画像を考える。

赤い円が \(x\) に対してどのように位置を変えるかに注目してほしい(\(x\) を水平方向とする)。

  • OpenCVでは、関数 cv::remap が単純なリマッピングの実装を提供する。

コード

  • What does this program do?
    • 画像を読み込む
    • 1秒ごとに4種類のリマッピング処理のうち1つを画像に適用し、それをウィンドウに無限に表示する。
    • ユーザーがプログラムを終了するのを待つ

解説

  • 画像を読み込む。

  • デスティネーション画像と2つのマッピング行列(x用とy用)を作成する

  • 結果を表示するウィンドウを作成する

  • ループを設定する。1000msごとにマッピング行列(mat_xmat_y)を更新し、それらをソース画像に適用する。

  • リマッピングを適用する関数は cv::remap である。次の引数を与える。

    • src: ソース画像
    • dst: src と同じサイズのデスティネーション画像
    • map_x: x方向のマッピング関数。\(h(i,j)\) の第1成分に相当する
    • map_y: 上と同じだが、y方向のもの。map_ymap_x はどちらも src と同じサイズである点に注意
    • INTER_LINEAR: 非整数ピクセルに使用する補間の種類。これがデフォルトである。
    • BORDER_CONSTANT: デフォルト

    マッピング行列 mat_xmat_y はどのように更新するのか? 読み進めてほしい。

  • Updating the mapping matrices: We are going to perform 4 different mappings:
    1. Reduce the picture to half its size and will display it in the middle:

      \[h(i,j) = ( 2 \times i - src.cols/2 + 0.5, 2 \times j - src.rows/2 + 0.5)\]

      for all pairs \((i,j)\) such that: \(\dfrac{src.cols}{4}<i<\dfrac{3 \cdot src.cols}{4}\) and \(\dfrac{src.rows}{4}<j<\dfrac{3 \cdot src.rows}{4}\)
    2. 画像を上下逆さまにする: \(h( i, j ) = (i, src.rows - j)\)
    3. 画像を左右反転する: \(h(i,j) = ( src.cols - i, j )\)
    4. bとcの組み合わせ: \(h(i,j) = ( src.cols - i, src.rows - j )\)

これは次のスニペットで表される。ここで map_xh(i,j) の第1座標を、map_y は第2座標を表す。

結果

  1. 上記のコードをコンパイルした後、画像パスを引数として与えて実行できる。例として、次の画像を使用する。
  1. これは画像を半分のサイズに縮小して中央に配置した結果である。
  1. 上下逆さまにした結果:
  1. x方向に反転した結果:
  1. 両方向に反転した結果: