Opencv:如何通过一些变化从现有矩阵创建新矩阵?

时间:2012-08-09 12:28:18

标签: opencv matrix copy repeat

在OpenCV中,我有一个这样的矩阵:[3 4 2; 5 2 1; 6 7 9],即3x3尺寸。现在我想将其更改为3x1大小,如下所示: [3 4 2 5 2 1 6 7 9]。但这并不是我想要的,我的实际目标是在每个值之前和之后放置零,同时重复每个值三次。所以我的目标矩阵应该是这样的:[0 3 3 0 0 4 4 4 0 0 2 2 2 0 0 5 5 5 0 0 2 2 2 0 0 1 1 1 0 0 6 6 6 0 0 7 7 7 0 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”循环,真的是时间混乱。提前谢谢了。

2 个答案:

答案 0 :(得分:0)

您可以首先调用矩阵上的reshape将其展平为一行/列。这样可以省去其中一个for循环并使其更加清晰。

答案 1 :(得分:0)

您可以使用Mat::reshape将3x3矩阵转换为3x1。这样你就需要一个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));

这就是全部。