3.2 矩阵和图像类型
生活随笔
收集整理的這篇文章主要介紹了
3.2 矩阵和图像类型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CvArr—>CvMat—>IplImage
CvMat矩陣結構
在OpenCV中沒有vector結構,只有列矩陣。
1 cvMat* cvCreateMat(int rows, int cols, int type); //新建一個二維矩陣type在這里可以是任何預定義的類型,預定義結構為 CV_<bit_length>(S|U|F)C<numbers_of_channels>,例如CV_32FC1,CV_8UC3。
1 //CvMat結構:矩陣頭 2 typedef struct CvMat{ 3 int type; 4 int step; 5 int* refcount; //僅英特爾使用 6 union{ 7 uchar* ptr; 8 short* s; 9 int* i; 10 float* f1; 11 double* db; 12 }data; 13 union{ 14 int rows; 15 int heights; 16 }; 17 union{ 18 int cols; 19 int width; 20 }; 21 }CvMat; 1 //創建一個指定行和列,數據類型的矩陣 2 CvMat* cvCreateMat(int rows, int cols, int type); 3 4 //僅創建矩陣頭,不為數據分配內存 5 CvMat* cvCreateMatHeader(int rows, int cols, int type); 6 7 //用已經存在的CMat結構初始化矩陣頭 8 CvMat* cvInitMatHeader( 9 cvMat* mat, 10 int rows, 11 int cols, 12 int type, 13 void* data = NULL, 14 int step = CV_AUTOSTEP 15 ); 16 17 //類似cvInitMatHeader(),但是為CMat分配了內存 18 CvMat cvMat( 19 int rows, 20 int cols, 21 int type, 22 void* data = NULL 23 ); 24 25 //用現有矩陣創建一個新的矩陣 26 CvMat* cvCloneMat(const CvMat* mat); 27 28 //釋放矩陣,包括矩陣頭和數據 29 void cvReleaseMat(CvMat** mat); 矩陣的創建和釋放 1 #include "cv.h" 2 3 int main(int argc, char** argv) 4 { 5 float vals[] = {0.866025, -0.500000, 0.500000, 0.866025}; 6 7 CvMat rotmat; 8 9 cvInitMatHeader( 10 &rotmat, 11 2, 12 2, 13 CV_32FC1, 14 vals 15 ); 16 return 0; 17 } 用固定數據創建一個OpenCV矩陣?矩陣數據的存取
1、簡單的方法
1 //利用CV_MAT_ELEM()宏存取矩陣 2 CvMat* mat = cvCreateMat(5, 5, CV_32FC1); 3 float element_3_2 = CV_MAT_ELEM(*mat, float, 3, 2); 1 //利用CV_MAT_ELEM_PTR()為矩陣設置一個數值 2 CvMat* mat = cvCreateMat(5, 5, CV_32FC1); 3 float element_3_2 = 7.7; 4 *((float*)CV_MAT_ELEM_PTR(*mat, 3, 2)) = element;2、麻煩的方法
1 //指針訪問矩陣結構,如果是僅僅讀取數據可用cvGet*D,返回矩陣元素值 2 uchar* cvPtr1D( 3 const CvArr* arr, //矩陣指針參數 4 int idx0, //表示索引的整數值 5 int* type = NULL //可選參數,代表輸出值的類型 6 ); 7 8 uchar* cvPtr2D( 9 const CvArr* arr, 10 int idx0, 11 int idx1, 12 int* type = NULL 13 ); 14 15 uchar* cvPtr3D( 16 const CvArr* arr, 17 int idx0, 18 int idx1, 19 int* type = NULL 20 ); 21 22 uchar* cvPtrND( 23 const CvArr* arr, 24 int* idx, 25 int* type = NULL, 26 int create_node = 1, 27 unsigned* precalc_hashaval = NULL 28 ); 1 //累加一個三通道矩陣中的所有元素 2 float sum(const CvMat* mat){ 3 float s = 0.0f; 4 for(int row=0; row<mat->rows; row++){ 5 const float* ptr = (const float*)(mat->data.ptr + row * mat->step); //指向每一行的頭指針 6 for(int col=0; col<mat->cols; col++){ 7 s += *ptr++; //先算*ptr,然后ptr++ 8 } 9 } 10 return s; 11 }自己寫一個方法讀取。
轉載于:https://www.cnblogs.com/chan20160228/p/5226250.html
總結
以上是生活随笔為你收集整理的3.2 矩阵和图像类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将php数组存取到本地文件
- 下一篇: EntityFreamWork 项目总结