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

Opencv:如何通过一些更改从现有矩阵创建新矩阵?,opencv,matrix,copy,repeat,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]. 但这并不是我想要的,我的实际目标是在每个值之前和之后置零,同时将每个值重复三次。所以我的目标矩阵应该是这样的:[03 3 0 0 4 0 0 2 2 0 0 5 5 0 2 0 0 0 1 1 0 6 6 0 0 7 7 0 9 0]。我为此编写了以下代码: for ( int i = 0; i < 3; i ++ )

在OpenCV中,我有这样一个矩阵:[3 4 2;5 2 1;6 7 9],大小为3x3。现在我想把它改成3x1大小,如下所示: [3 4 2 5 2 1 6 7 9]. 但这并不是我想要的,我的实际目标是在每个值之前和之后置零,同时将每个值重复三次。所以我的目标矩阵应该是这样的:[03 3 0 0 4 0 0 2 2 0 0 5 5 0 2 0 0 0 1 1 0 6 6 0 0 7 7 0 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(int i=0;i<3;i++)
{
对于(int j=0;j<3;j++)
{               
对于(int m=k+1;m

有没有更好的方法来解决这个问题?特别是没有“for”循环,它确实是时间混乱。非常感谢

您可以首先调用矩阵将其展平到一行/一列。这将为您节省一个for循环,并使其更加清晰

您可以使用将3x3矩阵转换为3x1。这样,您将需要一个for循环而不是两个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));
srcMat.整形(0,1);
对于(int i=0;i<9;i++)
dstMat(cv::Range::all(),cv::Range(i*5+1,i*5+4)).setTo(srcMat.at(i));

就这些。

非常感谢您的回答。行“srcMat.reformate(0,1)”不起作用,但如果我将其更改为“srcMat.reformate(1,0)”它就起作用。但这与我想要的不同。你知道原因是什么吗?我在这里读一个视频帧作为srcMat。第一个参数是新矩阵中的通道数,第二个参数是行数。当您为第二个参数指定零时,您仍然使用3x3垫。问题可能与elese有关,您确定源矩阵具有
int
类型吗?源矩阵为“CV_8U”类型。有什么想法吗?再次感谢。对于
CV_8U
使用
srcMat.at(i)
再次感谢您的回答。我像你说的那样变了。但是我发现问题出在“srcMat.reformate(0,1)”这一行。我目前使用的“srcMat”尺寸为800x600。有什么建议吗?