下面的類型可忘文生義
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 成員指一行的位元組數