0

OpenCV では、次のような行列があります: [3 4 2; 5 2 1; 6 7 9]、つまり 3x3 サイズです。これを 3x1 サイズに変更して、[3 4 2 5 2 1 6 7 9] のようにします。しかし、これはまさに私が望むものではありません。私の実際の目標は、各値の前後にゼロを置き、同時に各値を 3 回繰り返すことです。したがって、私の目標行列は次のようになります。 0 9 9 9 0 ]。このために次のコードを書きました。

for ( int i = 0; i < 3; i ++ )
    {
        for ( int j = 0; j < 3; j ++ )
        {               
                for ( int m = k + 1; m < m + 3; m ++ )
                {
                    dstMat.col (m) = srcMat.at <int> ( i, j );

                }

                k = k + 5 ;                 
        }
    }

何か良い方法はありますか?特に「for」ループがないと、本当に時間が混乱します。よろしくお願いします。

4

2 に答える 2

0

マトリックスでreshapeを呼び出して、1つの行/列にフラット化することから始めることができます。これにより、forループの1つが節約され、少し明確になります。

于 2012-08-09T15:12:18.687 に答える
0

Mat::reshapeを使用して、3x3 マトリックスを 3x1 に変換できます。この方法では、2 つではなく 1 つの for ループが必要になります。これはO(1)操作です。

ROI を使用して、次の for ループを省略できます。

  srcMat.reshape(0,1);
  for (int i =0; i < 9; i++)
    dstMat(cv::Range::all(), cv::Range(i*5+1, i*5+4)).setTo(srcMat.at<int>(i));

それだけです。

于 2012-08-09T15:31:21.857 に答える