2008年7月13日 星期日

資料結構操作與運算-CvMat資料結構操作(2)

這篇就是簡單的CvMat資料結構的操作啦,用函式讀取通道的方法,跟前面函式讀取IplImage資料結構的作法很相似,而CvMat資料結構的內容訊息也同樣的被包再下一層了.

CvMat資料結構的操作1
#include <cv.h>
#include <stdio.h>
#include <stdlib.h>


int main()
{
    uchar Array[]={1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,
                          5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,
                          9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12};

    double Channel1[3][4];
    double Channel2[3][4];
    double Channel3[3][4];
    double Channel4[3][4];

    CvMat Matrix1,*Matrix2;
    Matrix1=cvMat(3,4,CV_8UC4,Array);
    CvScalar Scalar1;
    Matrix2=cvCloneMat(&Matrix1);

    /*Load Matrix Channels*/
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<4;j++)
        {
            Scalar1=cvGet2D(&Matrix1,i,j);
            Channel1[i][j]=Scalar1.val[0];
            Channel2[i][j]=Scalar1.val[1];
            Channel3[i][j]=Scalar1.val[2];
            Channel4[i][j]=Scalar1.val[3];
        }
    }

    /*Implement Algorithms*/
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<4;j++)
        {
            printf("%.lf\n",Channel1[i][j]);
        }
    }

    /*Save Matrix Channels*/
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<4;j++)
        {
            Scalar1.val[0]=Channel1[i][j];
            Scalar1.val[1]=Channel2[i][j];
            Scalar1.val[2]=Channel3[i][j];
            Scalar1.val[3]=Channel4[i][j];
            cvSet2D(Matrix2,i,j,Scalar1);
        }
    }

    system("pause");
}

執行結果:


這裡做的是一個CvMat通道四的實作,而用cvCloneMat()複製了一份CvMat資料結構再將結果存回被複製的資料結構中,這邊要注意的是指標的運算,用cvMat()開啟矩陣,跟cvCloneMat()複製一份矩陣是有些微差異的,而再做cvGet2D(),cvSet2D()存取時規定要用double型別,用cvGet2D()的方法實際上就可以減少前面CvMat資料結構直接存取的一維陣列的運算,j的for迴圈也不需要一次跳4了,用這種方式來寫CvMat的Code是在好不過了.

cvCloneMat()
複製一份相同的CvMat資料結構,如果用cvMat()創造矩陣,則需要注意到指標的問題.
cvCloneMat(CvMat資料結構)



2 意見:

匿名 提到...

你好 请问cvmMul是否支持3通道矩阵运算?我的这样却不行!
float array1[]={3,1,2,0,1,5,1,2,0
,1,2,3,4,7,5,1,2,0};


void PrintMatrix(CvMat *Matrix,int Rows,int Cols,int Channels);
int main()
{
CvMat *A=cvCreateMat(2,3,CV_32FC3);
CvMat *B=cvCreateMat(3,2,CV_32FC3);
CvMat *ResultMatrix=cvCreateMat(2,2,CV_32FC3);

cvSetData(A,array1,A->step);
cvSetZero(B);
cvTranspose(A,B);
printf("cvmMul():\n");
cvmMul(A,B,ResultMatrix);
PrintMatrix(ResultMatrix,2,2,3);

system("pause");
return 1;
}
显示矩阵输出函数不能打上去,很抱歉哦 ,难道说3通道以上就不支持了?

yester 提到...

嗯~
是的,不過你可以改用IplImage資料結構,用COI的方法對每個通道做個別的運算,或者是用cvSplit()的方法做通道分割再個別運算,

Copyright 2008-2009,yester