《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问
? ? 老板讓讓做一個東東。輸入端要用到opencv順便就來學習一下。買了本書《學習opencv》翻來一看,opencv1.0,去官網上一看。opencv2.49,瞬間有種蛋碎的趕腳。看著第二章介紹一個頭文件,在opencv2.49以下招了半天都沒找到。。。淚奔~~
? ? 只是看到一些論壇上說。這本書里還是講了一些實用的算法的,所以還是決心細致讀一讀,里面的測試程序基本是親手輸入執行成功的,非常多樣例我自也用不同的方法實現了一下,畢竟入門級新手。望各位老鳥勿噴。還請各位大手多多指點。
? ? ? ??
1.opencv基本數據結構:
| 結構 | 成員 | 意義 |
| CvPoint | int?x,y | 圖像中的點 |
| CvPoint2D32f ? ?? | float?x,y | 二維空間中的點 |
| CvPoint3D32f | float?x,y,z | 三維空間中的點 |
| CvSize? | int?width,height | 圖像的尺寸 |
| CvRect | int?x,y,width,height | 圖像的部分區域 |
| CvScalar | double?val[4] | RGBA值 |
2.CvMat矩陣結構:
(1)兩點注意:
1.在Opencv中沒有向量結構,不論什么時候須要向量,都僅僅是一個列矩陣。
2.Opencv矩陣的概念與我們在線性代數課上學習過的概念相比。更抽象,特別是矩陣的元素。
(2)CvMat結構:
typedef struct CvMat{int type;int step;int* refcount;union{uchar* ptr;short* s;int* i;float *f1;double* db;} data;union{int rows;int height;};union{int cols;int width;}; }CvMat;(3)矩陣的創建與釋放
CvMat*?cvCreateMat(?int?rows,?int?cols,?int?type?);??//創建一個矩陣
CvMat*?cvCreateMatHeader(?int?rows,?int?cols,?int?type?);?//創建一個矩陣結構,不分配空間
CvMat*?cvInitMatHeader(CvMat*?mat,int?rows,int?cols,int?type,void*?data?=?NULL,int?step?=?CV_AUTOSTEP);//用一個現有矩陣初始化矩陣
CvMat?cvMat(int?rows,int?cols,int?type,void*?data?=?NULL);//初始化矩陣結構,不分配空間
CvMat*?cvCloneMat(?const?cvMat*?mat?);//復制一個mat副本
void?cvReleaseMat(?CvMat**?mat?);?//釋放矩陣
(4)創建一個矩陣程序:
3.矩陣數據的存取(簡單的方法。麻煩的方法,恰當的方法)
(1)簡單的方法:
利用CV_MAT_ELEM()宏存取矩陣
另外宏CV_MAT_ELEM_PTR()須要三個參數,傳入矩陣。待返回元素的行和列。
它和上個宏一樣。僅僅只是返回的是指向元素的指針。須要自己固定類型。
(2)麻煩的方法
使用cvPtr*D訪問矩陣,其結構為:
uchar* cvPtr1D(const CvArr* arr, //訪問矩陣int idx0, //元素索引int* type = NULL//元素類型);uchar* cvPtr2D(const CvArr* arr,int idx0,int idx1,int* type = NULL);uchar* cvPtr3D(const CvArr* arr,int idx0,int idx1,int idx2,int* type = NULL);uchar* cvPtrND(const CvArr* arr,int* idx,int* type = NULL,int create_node = 1,unsigned* precalc_hashval = NULL);訪問實例:
(3)恰當的方法
計算機視覺是一種密集型的任務。所以應該利用最有效的方法做事。
方法:轉載于:https://www.cnblogs.com/lxjshuju/p/7008131.html
總結
以上是生活随笔為你收集整理的《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 知乎高赞回答!财务小白快速上手报表分析(
- 下一篇: halcon联合C#测量十字Mark中心