1

サイズが 120x100x50 の opencv で 3D マトリックスを作成しました。

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

この行列の 1 番目と 2 番目の次元を 100x120x50 に転置したいと考えています。3 ループ反復を使用して手動で転置します

for ()
    for ()
    for ()
           dst.at<float>( , , ) = src.at<float>( , , );

しかし、この方法では時間がかかりすぎます。また、3 番目の次元は 50 であるのに対し、OpenCV マットは最大で 4 チャネルしかサポートしないため、3 番目の次元としてチャネルを使用できません。この作業をより迅速に行う他の方法はありますか? 3 番目の次元として 4 チャネルを使用してマトリックス 120x100x4 でテストすると、実行時間が大幅に短縮されるため、OpenCV がマルチチャネル マトリックスで行ったようなことを行うだけです。

4

1 に答える 1

0

配列値のような行列の値にアクセスするように変更します。実行時間ははるかに優れています。ただし、ブロックごとにコピーするのではなく、1 つずつアクセスします。

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]];
于 2013-07-10T06:09:16.133 に答える