OpenCV学习之矩阵操作.docxVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OpenCV学习之矩阵操作

OpenCV学习之矩阵操作1. 矩阵创建矩阵创建有多种方法,我们可以用cvCreateMat创建一个矩阵,该函数返回指向这个矩阵的指针,函数原型如下:CvMat*?cvCreateMat( int height, int width, int type );该方法既分配了矩阵头空间,也分配了数据空间。这个方法是最常用的方法。我们也可以使用cvCreateMatHeader函数只创建一个矩阵头,该函数返回指向这个矩阵的指针,函数原型如下:CvMat*?cvCreateMatHeader( int rows, int cols, int type );注意这里只为矩阵头分配了空间,没有为矩阵的数据域分配空间。你可以去看一下OpenCV的源代码,cvCreateMat包含了两步,一是头创建,二是数据域创建,函数源码如下:CV_IMPL CvMat*cvCreateMat( int height, int width, int type ){? ? CvMat* arr = cvCreateMatHeader( height, width, type );? ? cvCreateData( arr );? ? return arr;}也可以使用cvInitMatHeader方法初始化一个矩阵头,注意这里只对矩阵头进行初始化,既不分配矩阵头空间,也不分配数据域空间,函数原型如下:CvMat*?cvInitMatHeader( CvMat* arr, int rows, int cols,?int type, void* data, int step );2. 矩阵释放矩阵释放使用cvReleaseMat函数,函数原型如下:void?cvReleaseMat( CvMat** array );3. 矩阵数据的访问Learning OpenCV介绍了三种方法:(1)简单的方法得到矩阵的一个元素最简单的方法是利用宏CV_MAT_ELEM,该宏有四个参数,传入矩阵,待提取的元素类型,行和列。例如:float element_3_2 = CV_MAT_ELEM(*mat, float, 3, 2);设置矩阵的一个值可以使用宏CV_MAT_ELEM_PTR,例如:float element_3_2 = 7.7;*((float *)CV_MAT_ELEM_PTR(*mat, 3, 2)) = element_3_2;注意这些宏每次调用时都重新计算指针,在计划顺序访问矩阵中的所有元素时,缺点尤为突出,这些宏只适合简单访问矩阵中的某个元素。(2)复杂的方法如果仅仅读取数据,使用cvGet*D函数族,cvGet*D函数族有:CvScalar?cvGet1D( const CvArr* arr, intidx );CvScalar?cvGet2D( const CvArr* arr, int y, int x );CvScalar?cvGet3D( const CvArr* arr, int z, int y, int x );CvScalar?cvGetND( const CvArr* arr, const int* idx );cvPtr*D函数族cvPtr*D函数族有:uchar*?cvPtr1D( const CvArr* arr, intidx, int* _type );uchar*?cvPtr2D( const CvArr* arr, int y, int x, int* _type );uchar*?cvPtr3D( const CvArr* arr, int z, int y, int x, int* _type );uchar*?cvPtrND( const CvArr* arr, const int* idx, int* _type,?intcreate_node, unsigned* precalc_hashval );这些函数返回要访问元素的指针,我们可以利用这个指针进行一些算数运算后访问矩阵的其它元素。(3)恰当的方法恰当的方法就是利用矩阵的数据域指针自定义访问矩阵。例如累加三通道矩阵中所有的元素:float sum(const CvMat* mat){? ? float s = 0.0f;? ? for (int row = 0; row mat-rows; row++) {? ? ? ? const float *ptr = (const float *)(mat-data.ptr + row * mat-step);? ? ? ? for (col = 0; col mat-cols; col++) {? ? ? ? ? ? s += *ptr++;? ? ? ? }? ? }? ? return (s);}

文档评论(0)

178****9325 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档