2008年7月12日 星期六

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

這裡就介紹到CvMat用函式存取的方法啦,有許多的函式,基本上是可以跟前面IplImage資料結構共用的,OpenCV藉由CvArr這種曖昧不明的方式定義,但是像CvGetRows(),CvGetCols()則是必須要CvMat的輸出,以下為CvMat操作函式.

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


int ElemType;
int MatDims;
int DiagRows;
int DiagCols;

int main()
{

    CvMat *Matrix1;
    CvMat GetMatrixRows;
    CvMat GetMatrixCols;
    CvMat GetMatrixDiag;
    CvScalar Scalar1,Scalar2;

    Matrix1=cvCreateMat(20,10,CV_32FC3);

    ElemType=cvGetElemType(Matrix1);
    MatDims=cvGetDims(Matrix1);

    cvSet2D(Matrix1,3,3,cvScalar(34,2.6,9.9));
    cvGetRows(Matrix1,&GetMatrixRows,5,10);
    cvGetCols(Matrix1,&GetMatrixCols,3,7);
    cvGetDiag(Matrix1,&GetMatrixDiag,0);

    DiagRows=cvGetDimSize(Matrix1,0);
    DiagCols=cvGetDimSize(Matrix1,1);

    Scalar1=cvGet2D(Matrix1,3,3);

    printf("ElemType is : %d\n",ElemType);
    printf("MatDims is : %d\n",MatDims);
    printf("DiagRows is : %d\n",DiagRows);
    printf("DiagCols is : %d\n\n",DiagCols);

    printf("The Scalar 2D (3,3) Channels is : %.1f %.1f %.1f\n",Scalar1.val[0],Scalar1.val[1],Scalar1.val[2]);
    printf("Diag list :\n");
    for(int i=0;i<10;i++)
    {
        Scalar2=cvGet2D(&GetMatrixDiag,i,0);
        printf("%.1f %.1f %.1f\n",Scalar2.val[0],Scalar2.val[1],Scalar2.val[2]);
    }
    system("pause");
}

執行結果:


上面的程式為一些矩陣基本的操作,這邊跟前面不同的是使用到cvCreateMat()創造矩陣,而跟前面cvMat()不一樣的地方,cvMat()是初始化已經有空間的CvMat資料結構,而cvCreateMat()則是創造CvMat空間並且將矩陣初始化,所以要用指標來接,cvGetElemType()是取的矩陣參數代號,這邊矩陣參數代號是用公式來計算的,因此要知道矩陣代號就必須要用副程式執行,而cvGetDims(),cvGetDimSize(),cvSet2D(),cvGet2D()則是跟前面的用法一樣,只不過把寬跟高換成欄(colunms)跟列(rows),cvGetRows()則是擷取特定列數為5~10列,cvGetCols()為擷取特定欄數,為3~7欄,cvGetDiag()則是擷取對角線,數據會被放在列上面,變成10*1的矩陣,因為20*10的矩陣對角線最多也才10個,最後再將對角線取得的結果印出.

cvCreateMat()
創立CvMat資料結構,給予CvMat資料結構空間,並且初始化,第一個引數為列(rows),第二個為欄(colunms),第三個為CvMat資料結構參數.
cvCreateMat(列數數據,行數數據,CvMat資料結構參數)

cvGetElemType()
回傳矩陣參數數據,這邊只能用CvMat矩陣資料結構,放置IplImage資料結構一定會錯誤,CvMat的參數是藉由公式換算的,因此會需要用到此函式.
cvGetElemType(CvMat資料結構)

cvGetRows()
取得一整串列的矩陣輸入值可為IplImage資料結構或CvMat資料結構,第一個引數則是IplImage,CvMat二擇一,第二個引數一定要放CvMat,再來的引數為開始列數據,開始行數據,此函數有同樣性質的函數類為

cvGetRow()
cvGetRows()

cvGetRow()則是取得單行的CvMat列數據,與cvGetRows()相同
cvGetRows(IplImage資料結構或CvMat資料結構,空的CvMat資料結構,開始列數Int型別,結束列數Int型別)

cvGetRow()
取得單行CvMat資料結構的列數據,第一個引數放IplImage或CvMat資料結構,第二個放空的CvMat第三個則是放取得行數.
cvGetRow(IplImage資料結構或CvMat資料結構,空的CvMat資料結構,取得列數數據)

cvGetCols()
取得一整串欄的輸入值,第一個引數的輸入值可為IplImage資料結構或CvMat資料結構,第二個引數一定要放空的CvMat資料結構,第三個引數放開始欄數,第四個引數放結束欄數,此函數也有同樣性質的函數類為

cvGetCol()
cvGetCols()

cvGetCol()則是取得單行的CvMat欄數據,與cvGetCols()相似
cvGetCols(IplImage資料結構或CvMat資料結構,空的CvMat資料結構,開始欄數Int型別,結束欄數Int型別)

cvGetCol()
取得單行CvMat資料結構的欄據,第一個引數放IplImage或CvMat資料結構,第二個放空的CvMat第三個則是放取得欄的數據.
cvGetRow(IplImage資料結構或CvMat資料結構,空的CvMat資料結構,取得欄數數據)



1 意見:

阿貝 提到...

2.0版的opencv,cvCreateMat似乎不會幫你做初始化的動作,只是單純的配置空間而已

Copyright 2008-2009,yester