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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

? ? 只是看到一些論壇上說(shuō)。這本書(shū)里還是講了一些實(shí)用的算法的,所以還是決心細(xì)致讀一讀,里面的測(cè)試程序基本是親手輸入執(zhí)行成功的,非常多樣例我自也用不同的方法實(shí)現(xiàn)了一下,畢竟入門(mén)級(jí)新手。望各位老鳥(niǎo)勿噴。還請(qǐng)各位大手多多指點(diǎn)。

? ? ? ??

1.opencv基本數(shù)據(jù)結(jié)構(gòu):


結(jié)構(gòu)

成員

意義

CvPoint

int?x,y

圖像中的點(diǎn)

CvPoint2D32f ? ??

float?x,y

二維空間中的點(diǎn)

CvPoint3D32f

float?x,y,z

三維空間中的點(diǎn)

CvSize?

int?width,height

圖像的尺寸

CvRect

int?x,y,width,height

圖像的部分區(qū)域

CvScalar

double?val[4]

RGBA


2.CvMat矩陣結(jié)構(gòu):

(1)兩點(diǎn)注意:

1.在Opencv中沒(méi)有向量結(jié)構(gòu),不論什么時(shí)候須要向量,都僅僅是一個(gè)列矩陣。

2.Opencv矩陣的概念與我們?cè)诰€性代數(shù)課上學(xué)習(xí)過(guò)的概念相比。更抽象,特別是矩陣的元素。

(2)CvMat結(jié)構(gòu):

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)建一個(gè)矩陣

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

CvMat*?cvInitMatHeader(CvMat*?mat,int?rows,int?cols,int?type,void*?data?=?NULL,int?step?=?CV_AUTOSTEP);//用一個(gè)現(xiàn)有矩陣初始化矩陣

CvMat?cvMat(int?rows,int?cols,int?type,void*?data?=?NULL);//初始化矩陣結(jié)構(gòu),不分配空間

CvMat*?cvCloneMat(?const?cvMat*?mat?);//復(fù)制一個(gè)mat副本

void?cvReleaseMat(?CvMat**?mat?);?//釋放矩陣


(4)創(chuàng)建一個(gè)矩陣程序:


#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.矩陣數(shù)據(jù)的存取(簡(jiǎn)單的方法。麻煩的方法,恰當(dāng)?shù)姆椒?


(1)簡(jiǎn)單的方法:

利用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()須要三個(gè)參數(shù),傳入矩陣。待返回元素的行和列。

它和上個(gè)宏一樣。僅僅只是返回的是指向元素的指針。須要自己固定類型。

(2)麻煩的方法

使用cvPtr*D訪問(wèn)矩陣,其結(jié)構(gòu)為:

uchar* cvPtr1D(const CvArr* arr, //訪問(wèn)矩陣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);

訪問(wèn)實(shí)例:


#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)恰當(dāng)?shù)姆椒?/span>

計(jì)算機(jī)視覺(jué)是一種密集型的任務(wù)。所以應(yīng)該利用最有效的方法做事。

方法:


#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


轉(zhuǎn)載于:https://www.cnblogs.com/lxjshuju/p/7008131.html

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。