日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问

發(fā)布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? 老板讓讓做一個東東。輸入端要用到opencv順便就來學習一下。買了本書《學習opencv》翻來一看,opencv1.0,去官網上一看。opencv2.49,瞬間有種蛋碎的趕腳。看著第二章介紹一個頭文件,在opencv2.49以下招了半天都沒找到。。。淚奔~~

? ? 只是看到一些論壇上說。這本書里還是講了一些實用的算法的,所以還是決心細致讀一讀,里面的測試程序基本是親手輸入執(zhí)行成功的,非常多樣例我自也用不同的方法實現了一下,畢竟入門級新手。望各位老鳥勿噴。還請各位大手多多指點。

? ? ? ??

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

圖像的部分區(qū)域

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)矩陣的創(chuàng)建與釋放

CvMat*?cvCreateMat(?int?rows,?int?cols,?int?type?);??//創(chuàng)建一個矩陣

CvMat*?cvCreateMatHeader(?int?rows,?int?cols,?int?type?);?//創(chuàng)建一個矩陣結構,不分配空間

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)創(chuàng)建一個矩陣程序:


#include <cv.h> #include <iostream> using namespace std;int _tmain(int argc, _TCHAR* argv[]) {float vals[] = {1,2,3,4};CvMat rotmat;cvInitMatHeader(&rotmat,2,2, CV_32FC1,vals);cout << rotmat.cols <<endl;cout << rotmat.step <<endl;cout << rotmat.rows <<endl;cout << rotmat.type <<endl;getchar();return 0; }

3.矩陣數據的存取(簡單的方法。麻煩的方法,恰當的方法)


(1)簡單的方法:

利用CV_MAT_ELEM()宏存取矩陣


#include "stdafx.h" #include <cv.h> #include <iostream> using namespace std;int _tmain(int argc, _TCHAR* argv[]) {float vals[] = {1,2,3,4};CvMat* rotmat = cvCreateMat( 2, 2, CV_32FC1 );cvInitMatHeader(rotmat,2,2, CV_32FC1,vals);float ele = CV_MAT_ELEM(*rotmat,float,1,1);cout << ele << endl;getchar();return 0; }

另外宏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);

訪問實例:


#include <cv.h> #include <iostream> using namespace std;int _tmain(int argc, _TCHAR* argv[]) {float vals[] = {1,2,3,4};CvMat* rotmat = cvCreateMat( 2, 2, CV_32FC1 );cvInitMatHeader(rotmat,2,2, CV_32FC1,vals);float *p = (float*) cvPtr2D(rotmat,1,1);cout <<*p<<endl;getchar();return 0; }
(3)恰當的方法

計算機視覺是一種密集型的任務。所以應該利用最有效的方法做事。

方法:


#include <cv.h> #include <iostream> using namespace std;float sum( CvMat* mat ) {float s = 0.0f;for( int row=0; row<mat->height; row++ ) {float* ptr = mat->data.fl + row * mat->step/4;for( int col=0; col<mat->width; col++ ) {s += *ptr++;}}return( s ); };int main(int argc, char** argv) {CvMat *mat = cvCreateMat(2,2,CV_32FC1);float elem = 2;*((float*)CV_MAT_ELEM_PTR( *mat, 0,0) ) = elem;cvmSet(mat,0,1,3);cvSetReal2D(mat,1,0,4);cvSetReal2D(mat,1,1,5);float s = sum(mat);printf("%f\n",s);getchar();return 0; } ? ?to be continued


轉載于:https://www.cnblogs.com/lxjshuju/p/7008131.html

總結

以上是生活随笔為你收集整理的《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。