opencv - 在opencv中快速转置3D矩阵

标签 opencv matrix

我在 opencv 中创建了一个大小为 120x100x50 的 3D 矩阵:

int _sz[] = {120,100,50};
Mat src(3,_sz,CV_32FC1,Scalar(2));

我想将此矩阵的第一维和第二维转置为 100x120x50。
我使用 3 循环迭代手动转置
for ()
    for ()
    for ()
           dst.at<float>( , , ) = src.at<float>( , , );

但是这种方式耗时太长。而且,我不能将 channel 用作第三维,因为第三维是 50,而 OpenCV mat 最多仅支持 4 个 channel 。有没有其他方法可以更快地完成这项工作?就像 OpenCV 对多 channel 矩阵所做的那样,因为当我使用 4 channel 作为第三维来测试矩阵 120x100x4 时,执行时间要好得多。

最佳答案

我更改为访问矩阵的值,如数组值。执行时间要好得多。但它仍然是逐个访问,而不是逐 block 复制。

int indexOrder[3];
int order[3]={1,0,2};
int* _srcSize = srcMat.size.p;
int srcMatSize[] = {_srcSize[0],_srcSize[1],_srcSize[2]};
int dstMatSize[] = {srcMatSize[order[0]], srcMatSize[order[1]], srcMatSize[order[2]]}; 
Mat dstMat(3, dstMatSize, CV_32FC1);
float* srcArr, *dstArr;
srcArr = srcMat.ptr<float>();
dstArr = dstMat.ptr<float>();

for (indexOrder[0]=0;indexOrder[0]<srcMatSize[0];indexOrder[0]++)
  for (indexOrder[1]=0;indexOrder[1]<srcMatSize[1];indexOrder[1]++)
    for (indexOrder[2]=0;indexOrder[2]<srcMatSize[2];indexOrder[2]++)               
        dstArr[indexOrder[order[0]]*dstMatSize[1] + indexOrder[order[1]]*dstMatSize[2] + indexOrder[order[2]]] = 
                    srcArr[indexOrder[0]*srcMatSize[1]+indexOrder[1]*srcMatSize[2]+indexOrder[2]];

关于opencv - 在opencv中快速转置3D矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17505267/

相关文章:

java - 如何限制 Canvas 的翻译矩阵?

matlab - 用矩阵中的行索引替换非 NaN 值

python - opencv/ python : Draw image over a webcam stream

python - 属性错误 : 'module' object has no attribute 'drawAxis'

opencv - 将 JavaCV 与 Kotlin 结合使用

r - 做一个 block 矩阵0s

r - 使用 col 行索引从矩阵中提取值

r - 矩阵 "<="第 i 行中的元素是向量的第 i 个元素

python - 在 Python 的 OpenCV 中找不到 cv2.cv 模块

python - 检测 .pdf 或图像中的框并将其裁剪为单个图像