Opencv总结

举报
用户已注销 发表于 2022/03/17 22:43:55 2022/03/17
【摘要】 目录 一,调用库函数的通用问题 1,const的传递 2,异常 二,Mat的内存管理 1,三种创建Mat对象的方法 2,Mat的拷贝 (1)= 运算符 (2)copyTo函数 (3)clone函数 3,Mat的内存结构 一,调用库函数的通用问题 调用Opencv的库函数,有一些和调用其他库函数相同的问题: ...

目录

一,调用库函数的通用问题

1,const的传递

2,异常

二,Mat的内存管理

1,三种创建Mat对象的方法

2,Mat的拷贝

(1)= 运算符

(2)copyTo函数

(3)clone函数

3,Mat的内存结构


一,调用库函数的通用问题

调用Opencv的库函数,有一些和调用其他库函数相同的问题:

1,const的传递

如果库函数使用的参数是非const的,那么调用者都是非const的,

这会沿着参数的传递链进行传递,除非有一层使用拷贝,再往上层才能变成const调用。

2,异常

有些异常Opencv会捕获处理,或者捕获再往上抛出异常,

但是有的异常不会捕获,导致进程崩溃。

二,Mat的内存管理

1,三种创建Mat对象的方法


  
  1. Mat image1;
  2. Mat image2(500, 500, CV_8U);
  3. char ch[100];
  4. Mat image3(10, 10, CV_8U, ch);

第一种创建空Mat不会分配内存,第二种创建对象并分配内存,第三种根据给定内存创建对象。

2,Mat的拷贝

(1)= 运算符

直接把data指针拷贝过来,不拷贝数据。参见Opencv源码解析

(2)copyTo函数

copyTo在各种场景下都是深拷贝。

场景一,目标Mat是空的


  
  1. int main()
  2. {
  3. Mat img = Mat(10,10, CV_8U);
  4. Mat img2;
  5. img.copyTo(img2);
  6. return 0;
  7. }

这种情况下会调用create函数给目标Mat分配内存。

PS:如果源是空的,或者源和目标都是空的,运行貌似没问题。

场景二,源和目标尺寸一致


  
  1. int main()
  2. {
  3. Mat img = Mat(10, 10, CV_8U);
  4. uchar ch[100];
  5. Mat img2(10, 10, CV_8U, ch);
  6. img.copyTo(img2);
  7. if (img2.data == ch)cout << "data ptr not changed";
  8. else cout << "data ptr changed";
  9. return 0;
  10. }

输出:data ptr not changed

说明拷贝的时候,img2的data指针并没有改变。

场景三,源比目标的尺寸不一致

第一行改成

Mat img = Mat(10, 11, CV_8U);
 

输出:data ptr changed

这种情况下会调用create函数给目标Mat分配内存。

改成其他各种尺寸也都试过了,只要不是行和列都一样,都会重新分配内存。

(3)clone函数

opencv\opencv-4.2.0\modules\core\include\opencv2\core\mat.inl.hpp中的源代码:


  
  1. inline
  2. Mat Mat::clone() const
  3. {
  4. Mat m;
  5. copyTo(m);
  6. return m;
  7. }

直接调用copyTo做一个深拷贝。

3,Mat的内存结构

Mat中存放的是一个二维或多维数组,维度之间是有唯一顺序的,满足如下规律:

对于2维数组,每一行都是连续的,行和行之间可能不连续,但是他们的首地址一定是等间距的。

对于n(n>2)维数组,其实就是若干个n-1维数组组合而成,这些数组都递归满足本规律,这些数组的首地址一定是等间距的。

间距信息保存在step数组中,利用他可以实现所有元素的随机访问、几乎不耗时间的截取操作。

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/123542984

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。