首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >opencv中3D矩阵的快速转置

opencv中3D矩阵的快速转置
EN

Stack Overflow用户
提问于 2013-07-07 01:19:11
回答 1查看 1.2K关注 0票数 1

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

代码语言:javascript
运行
复制
int _sz[] = {120,100,50};
Mat src(3,_sz,CV_32FC1,Scalar(2));

我想将这个矩阵的第一维和第二维转置为100x120x50。我使用3次循环迭代来手动转置

代码语言:javascript
运行
复制
for ()
    for ()
    for ()
           dst.at<float>( , , ) = src.at<float>( , , );

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

EN

回答 1

Stack Overflow用户

发布于 2013-07-10 14:09:16

我改为访问矩阵的值,就像数组的值。执行时间要短得多。但它仍然是一个接一个地访问,而不是逐块复制。

代码语言:javascript
运行
复制
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]];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17505267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档