1

私はUbuntuOpencvで作業しています.1つの画像のPCA分析を行おうとしています.3チャンネルの画像を取得し、3列でr*cの行数を持つ単一チャンネルの画像に変更します.rとcは行ですPCAで逆投影を行った後、再構成された画像を表示しようとすると、緑色の画像が表示されます。これが私のコードです。

Mat pcaset=cvCreateMat(image->height*image->width,image->nChannels,CV_8UC1);
for(int i=0;i<image->height;i++)
    {
        for(int j=0;j<image->width;j++)
        {
            for(int k=0;k<image->nChannels;k++)
            (ptrpcaset+i*pcaset.step)[k]=((ptrimage+i*image->widthStep)[3*j+k]);

       }

    }
int nEigens=3;
    Mat databackprojected;
    PCA pca(pcaset,Mat(),CV_PCA_DATA_AS_ROW,nEigens);
    Mat dataprojected(pcaset.rows,nEigens,CV_8UC1);
    pca.project(pcaset,dataprojected);
    pca.backProject(dataprojected,databackprojected);
    Mat backprojectnorm;//(databackprojected.rows,nEigens,CV_8UC1);
    normalize(databackprojected,backprojectnorm,0,255,NORM_MINMAX,-1);
    Mat finaldataafterreshaping(image->height,image->width,CV_8UC3);
    uchar* finalptr=(uchar*)finaldataafterreshaping.data;
    uchar* ptrnorm=(uchar*)backprojectnorm.data;

    int x=0,y=0,i=0;

    while(i<backprojectnorm.rows)
    {
        while(x<image->height)
        {
            while(y<image->width)
            {
                for(int k=0;k<image->nChannels;k++)
                {
                    (finalptr+x*finaldataafterreshaping.step)[3*y+k]=(ptrnorm+i*backprojectnorm.step)[k];
                }
                y=y+1;i=i+1;
            }
            x=x+1;y=0;
        }
    }
imshow("Reconstructed data",finaldataafterreshaping);
4

1 に答える 1

1

次の変更を行う必要があります。

(ptrpcaset+(j + i*image->width)*pcaset.step)[k]=((ptrimage+i*image->widthStep)[3*j+k]);

データを変換するときにj座標を考慮していないため、最後に画像の最後の行だけを新しいマトリックスに保存します。

データの形状を変更するときは、次のようなことを行う必要があります。

float* val = (float*)&(ptrnorm+i*backprojectnorm.step)[(k*4)];
(finalptr+x*finaldataafterreshaping.step)[3*y+k]=*val;

結果として得られる行列は型floatであり、ではないためucharです。したがって、何らかの変換を行う必要があります。このようにするのが良いかどうかはわかりませんが、機能します。OpenCV2のC++APIをご覧になることをお勧めします。これは、このことをはるかにうまく処理できます。

また、while(i<backprojectnrom.rows)ループ全体は必要ありません。

于 2012-04-12T08:29:44.430 に答える