學習opencv第三章 基礎資料型別 (Elementary Data Type) ,矩陣建立,操作,訪問

來源:互聯網
上載者:User

下面的類型可忘文生義

CvPoint     

CvSize

CvRect

CvScalar   // scalar翻譯為 標量

typedef struct CvScalar
{
    double val[4];
}
CvScalar; //故CvScalar正好可以存在一個色彩空間的值如:RGBA色彩空間

這四種類型C語言版中都為結構體,成員為整型  (具體的可以進入其標頭檔查看)

在後面加上2D32f  , 2D64f, 3D32f , 3D64f就變成了成員為float或者double型的

產生這4種類型的函數為  (後面可以加上2D32f等:

cvPoint

cvSize

cvRect

cvScalar

特點:

若Cv ,則為資料類型

若cv,則為產生對應資料類型的函數


矩陣和映像類型 opencv 2.0+ 的版本 可分為C語言版和C++版  ,C++版的類型都被封裝成了類 ,(標頭檔為.hpp, 定義在cv的名字空間下,使用using namespace cv後,函數和類都不需要加Cv , 如類為cv::Mat)   .

C語言版的類型都為結構體,對應標頭檔為(*.h) , 所以的函數和類型首碼都為Cv或者cv或者CV

CvArr 不為類型 

查看標頭檔發現: #typedef void CvArr   ,有很多函數傳入此類型的指標即void *,,,      :一般需要傳入CvArr* 的地方都可以用CvMat*或者IplImage*指標傳入

CvMat矩陣,映像類型

IplImage 儲存映像的類型

儲存類型有:

CV_

RGBA 色彩空間,  RGB表示紅綠藍  ,  A為alpha通道,表示不透明度

CvMat 相應的函數:

CVAPI(CvMat*) cvCreateMat( int rows, int cols, int type );//建立CvMat結構體及其分配指向的資料

CVAPI(CvMat*) cvCreateMatHeader( int rows, int cols, int type );//只產生CvMat結構體

CVAPI(void) cvCreateData( CvArr* arr );  //為CvMat分配資料空間

CVAPI(CvMat*) cvCloneMat( const CvMat* mat )  //完全複製CvMat,包括data

CVAPI(CvMat*) cvInitMatHeader( CvMat* mat, int rows, int cols, int type, void* data CV_DEFAULT(NULL), int step CV_DEFAULT(CV_AUTOSTEP) );//初始化已存在的CvMat類型

CVAPI(void) cvReleaseMat( CvMat** mat );

CVAPI(int) cvGetElemType( const CvArr* arr )

CVAPI(int) cvGetDims( const CvArr* arr, int* sizes CV_DEFAULT(NULL) );

CVAPI(int) cvGetDimSize( const CvArr* arr, int index )



CvMat資料讀取: 1. 使用宏(簡單的方法):

CV_MAT_ELEM     //CV_MAT_ELEM( mat, elemtype, row, col )返回elemtype型的值,只能讀

CV_MAT_ELEM_PTR  //返回void *指標,使用時得自己強制轉化成對應的類型

#define CV_MAT_ELEM( mat, elemtype, row, col ) (*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))

#define CV_MAT_ELEM_PTR( mat, row, col ) CV_MAT_ELEM_PTR_FAST( mat, row, col, CV_ELEM_SIZE((mat).type) )


2.麻煩的方法(用函數擷取值或者指標)

CVAPI(double) cvGetReal1D( const CvArr* arr, int idx0 ) //一維

CVAPI(double) cvGetReal2D( const CvArr* arr, int idx0, int idx1 )  //二維

CVAPI(double) cvGetReal3D( const CvArr* arr, int idx0, int idx1, int idx2 )

CVAPI(double) cvGetRealND( const CvArr* arr, const int* idx )

CVAPI(CvScalar) cvGet1D( const CvArr* arr, int idx0 )

CVAPI(CvScalar) cvGet2D( const CvArr* arr, int idx0, int idx1 )

CVAPI(CvScalar) cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 )

CVAPI(CvScalar) cvGetND( const CvArr* arr, const int* idx )

這是擷取矩陣值的方法 .

其中 帶有Real只能用在單通道矩陣中!

不帶Real的可以用在任意通道數的矩陣中 ,  返回的值為一個CvScalar

若為單通道,則CvScalar裡面存放的4個double中,只第一個有用。若矩陣為RGB映像,則擷取的(row,col)處的值RGB正好對應CvScalar前三個double成員

因為如對於RGB色彩空間映像資料的儲存是交錯存放的即:RGBRGBRGBRGB...

擷取元素指標的方法:

CVAPI(uchar*) cvPtr1D( const CvArr* arr, int idx0, int* type CV_DEFAULT(NULL))

CVAPI(uchar*) cvPtr2D( const CvArr* arr, int idx0, int idx1, int* type CV_DEFAULT(NULL) )

CVAPI(uchar*) cvPtr3D( const CvArr* arr, int idx0, int idx1, int idx2, int* type CV_DEFAULT(NULL))

這三個函數得到的是uchar* 型的指標,即unsigned char *指標,使用時還得強制轉化成相應的指標,如double * ,  float * , int *等


相應的還有讀和存的函數:

CVAPI(void) cvSetReal1D( CvArr* arr, int idx0, double value )  //對單通道

...2D  ...3D ..4D ..ND

CVAPI(void) cvSet1D( CvArr* arr, int idx0, CvScalar value )    //對多通道

..2D ..  3D .. 4D 

對於浮點型單通道有專用的函數訪問  (即類型為CV_64FC1的):

CV_INLINE double cvmGet( const CvMat* mat, int row, int col )

CV_INLINE void cvmSet( CvMat* mat, int row, int col, double value )


恰當的方法(直接用指標操作)

做影像處理都是運算密集型,用上述函數訪問的方法會比較慢了  ,, 

CvMat和IplImage類型中都有個step成員 , step 成員指一行的位元組數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.