opencv学习笔记[9]:Opencv的基本数据类型和矩阵结构
一.基本數(shù)據(jù)類型:
1.CvPoint
???????? 圖像中的點(diǎn)
???????? Opevcv提供的數(shù)據(jù)類型中最簡(jiǎn)單的就是CvPoint.
| typedef struct CvPoint { ??? int x; ??? int y; } CvPoint |
???????? CvPoint包含int x 和int y兩個(gè)數(shù)據(jù)成員,它的變體有CvPoint2D32f 和 CvPoint3D32f.
???????? CvPoint2D32f包含float x , float y兩個(gè)數(shù)據(jù)成員.
???????? 二維空間中的點(diǎn)
?
| typedef struct CvPoint2D32f { ??? float x; ??? float y; } CvPoint2D32f |
?
???????? CvPoint3D32f 包含float x , float y , float z 三個(gè)數(shù)據(jù)成員.
???????? 三維空間中的點(diǎn)
?
| typedef struct CvPoint3D32f { ??? float x; ??? float y; ??? float z; } CvPoint3D32f |
?
2. CvSize
???????? CvSize的數(shù)據(jù)成員是: int width , int height.
???????? 圖像的尺寸
?
| typedef struct CvSize { ??? int width; ??? int height; } CvSize; ? |
對(duì)應(yīng)的浮點(diǎn)類型的數(shù)據(jù)成員 , CvSize的變體: CvSize2D32f.
?
| typedef struct CvSize2D32f { ??? float width; ??? float height; } CvSize2D32f; |
?
3.CvRect
???????? 圖像的部分區(qū)域
???????? 派生自CvPoint和CvSize.
?
| typedef struct CvRect { ??? int x; ??? int y; ??? int width; ??? int height; } CvRect; |
?
4.CvScalar
???????? RGBA值
???????? 有一個(gè)單獨(dú)的數(shù)據(jù)成員val , 它是一個(gè)指向4個(gè)雙精度浮點(diǎn)數(shù)數(shù)組的指針.
?
| typedef struct CvScalar { ??? double val[4]; } CvScalar ? |
?
5.CvMat
| typedef struct CvMat { ??? int type; ??? int step; ? ??? /* for internal use only */ ??? int* refcount; ??? int hdr_refcount; ? ??? union ??? { ??????? uchar* ptr; ??????? short* s; ??????? int* i; ??????? float* fl; ??????? double* db; ??? } data; ? #ifdef __cplusplus ??? union ??? { ??????? int rows; ??????? int height; ??? }; ? ??? union ??? { ??????? int cols; ??????? int width; ??? }; #else ??? int rows; ??? int cols; #endif ? } CvMat; |
????????
二、矩陣的創(chuàng)建和釋放:
1.矩陣的創(chuàng)建
| Path1:? CvMat* cvCreateMat(int rows, int cols, int type) //分配內(nèi)存空間 Path2:? CvMat* cvCreateMatHeader(int rows, int cols, int type) //不分配分配內(nèi)存空間 Path3:? CvMat* cvInitMatHeader(CvMat* mat, int rows, int cols, int type, void* data=NULL, int step=CV_AUTOSTEP)//利用現(xiàn)有的mat結(jié)構(gòu)創(chuàng)建一個(gè)新的矩陣 Path4:? CvMat cvMat(int rows, int cols, int type, void* data=NULL) //輕量級(jí)創(chuàng)建一個(gè)矩陣并分配存儲(chǔ)空間的辦法 Path5:? CvMat* cvCloneMat(const CvMat* mat) //header and data are all allocated. |
?
| #include <cv.h> #include <highgui.h> int main() { ???????? float vals[]={0.866025,-0.50000,0.500000,0.866025}; ???????? CvMat rotmat; ???????? cvInitMatHeader(&rotmat,2,2,CV_32FC1,vals); }?????? |
2.矩陣的存取方法:
????
| 1.簡(jiǎn)單的方法: ?????????????????? CV_MAT_ELEM()? CV_MAT_ELEM_PTR() 存取數(shù)據(jù)。 例程: ???????? CvMat * mat1 = cvCreateMat( 5,5,CV_32FC1); ???????? float element_3_3 = 7.7; ???????? *((float *)CV_MAT_ELEM_PTR(*mat1,3,2) ) =element_3_3; 2.麻煩的方法:?? ??? 返回指針的: C: uchar* cvPtr1D(const CvArr* arr, int idx0, int* type=NULL) ? C: uchar* cvPtr2D(const CvArr* arr, int idx0, int idx1, int* type=NULL) ? C: uchar* cvPtr3D(const CvArr* arr, int idx0, int idx1, int idx2, int* type=NULL) ? C: uchar* cvPtrND(const CvArr* arr, int* idx, int* type=NULL, int createNode=1, unsigned int* precalcHashval=NULL) ? 返回元素對(duì)象: cvGetReal*D() cvGet*D() cvSetReal*D() cvSet*D() cvSet()//處理單通道數(shù)據(jù) cvGet() //處理單通道數(shù)據(jù) |
?
| 3.適當(dāng)?shù)姆椒?/span> /** 累加一個(gè)三通道矩陣中的所有元素 **/ #include <cv.h> #include <highgui.h> ? float sum(const CvMat * mat) { ??? float s = 0.0f; ??? for(int row=0;row<mat->rows;row++) ??? { ??????? float * ptr = (float *)(mat->data.ptr + row * mat->step);//每一行都要重新計(jì)算起始位置 ??????? for(int col =0;col<mat->cols;col++) ??????? { ??????????? s+= *ptr ++; //ptr++指向下一個(gè)數(shù)據(jù) ??????? } ??? } ??? return s; } int main() { ??? float vals[]={0.866025,-0. |
3.點(diǎn)的數(shù)組
???????? 注意點(diǎn)的存儲(chǔ)和內(nèi)存布局的關(guān)系。
???????? 例如:有n個(gè)三維的點(diǎn),存儲(chǔ)到CvMat 結(jié)構(gòu)中,有幾種存儲(chǔ)方式?
???????? ①用一個(gè)二維數(shù)組,數(shù)組的類型是:CV32FC1,n行3列
???????? ②用一個(gè)二維數(shù)組,數(shù)據(jù)的類型是:CV32FC1,3行n列
???????? ③用一個(gè)二維數(shù)組,數(shù)據(jù)的類型是:CV32FC3,n行1列
???????? ④用一個(gè)二維數(shù)組,數(shù)據(jù)的類型是:CV32FC3,1行n列
注意:CV32FC1等的結(jié)構(gòu)都是順序型的通道。通道的概率其實(shí)我也不是很明確。
目前的理解是:
???????? 我們可以看出,前三種的內(nèi)存分配情況相同,但最后一種的內(nèi)存分配不同。更復(fù)雜的是,如果有n維數(shù)組,每個(gè)數(shù)組的元素是c維(c可能是 通道數(shù))時(shí)。所以,多維數(shù)組(矩陣)和一個(gè)一維但包含多維數(shù)據(jù)的數(shù)組一般是不同的。
對(duì)于一個(gè)Rows行Cols列,通道數(shù)為Channels的矩陣,訪問其中第row行,第col列,第channel通道的數(shù)據(jù),可以使用如下公式:
數(shù)據(jù)地址偏移量=row*Cols*Channels+col*Channels+channel
轉(zhuǎn)載于:https://www.cnblogs.com/feng-fan/archive/2013/03/04/2943040.html
總結(jié)
以上是生活随笔為你收集整理的opencv学习笔记[9]:Opencv的基本数据类型和矩阵结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webstorm 主题设置 皮肤设置
- 下一篇: linux键盘修改工具,Linux 键盘