2

画像内のすべてのピクセルを右に 1px 移動したいのですが、以下はリマップ変換を行うために使用するマップです。

このアプローチは、このような単純な変換を行うのに必要な時間よりもはるかに多くの時間を必要とします。使用できる cv 関数はありますか? または、画像を 2 つの画像に分割し、1 つは幅 src.cols-1 ピクセル、もう 1 つは幅 1 ピクセルで、それらを新しい画像にコピーしますか?

void update_map()
{
    for( int j = 0; j < src.cols; j++ ){
       for( int i = 0; i < src.rows; i++ ){
         if (j == src.cols-1)
             mat_x_Rotate.at<float>(i,j) = 0;
         else
            mat_x_Rotate.at<float>(i,j) = j + 1;
            mat_y_Rotate.at<float>(i,j) = i;
         }
     }
}
4

2 に答える 2

8

パフォーマンスを向上させるためにできること:

  • この目的のために再マップはやり過ぎです。リマップ変換全体を定義してから使用するよりも、ピクセルを直接コピーする方が効率的です。
  • ループの順序を切り替えます。行、次に列を繰り返します。(OpenCVMatは行優先順で格納されるため、最初に列を反復処理することは非常にキャッシュに不向きです)
  • Mat::ptr()C スタイルの配列として、同じ行のピクセルに直接アクセスするために使用します。at<>()(これは、おそらく各アクセスのインデックスのチェックなどを行うを使用するよりもパフォーマンスが大幅に向上します)
  • ifステートメントを内側のループから取り出し、列を個別に処理し0ます。

別の方法として: はい、上記のように、画像を部分に分割して新しい画像にコピーすることは、直接コピーするのとほぼ同じくらい効率的です。

于 2012-08-16T19:19:57.597 に答える