在OpenCV中,我有一个这样的矩阵:[3 4 2; 5 2 1; 6 7 9],大小为3x3。现在我想把它改成 3x1 的大小,然后像这样:[3 4 2 5 2 1 6 7 9].但这并不完全是我想要的,我的实际目标是在每个值前后放置零,同时将每个值重复三次。所以我的目标矩阵应该是这样的:[ 0 3 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 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"循环,它真的是时间混乱。提前非常感谢。
您可以使用 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));
仅此而已。
矩阵上调用 reshape 开始,将其展平为一行/一列。 这将为您节省一个 for 循环并使其稍微清晰一些。