C++ cv::Mat的深浅拷贝
时间: 2024-11-28 12:11:56 浏览: 7
C++学习小结
在OpenCV中,`cv::Mat`对象代表图像数据,它的复制行为取决于操作的类型。这里有两种主要的拷贝方式:
1. **浅拷贝**(Shallow Copy)[^1]:
- 当通过赋值操作符 `b(a)` 或者 `c = b` 进行复制时,实际上是创建了一个指向原矩阵`a`内存地址的新引用。这意味着对新变量`b`或`c`的修改也会反映在原始`a`上。例如:
```cpp
cv::Mat a(src);
cv::Mat b = a; // 这里是浅拷贝,b和a共享同一块内存
```
2. **深拷贝**(Deep Copy):
- 而通过构造函数如 `cv::Mat check_b(src);` 创建新的`cv::Mat`对象,这是深拷贝,它会复制源矩阵的内容到一个新的内存区域,因此修改`check_b`不会影响`src`:
```cpp
cv::Mat check_b(src); // 这里是深拷贝,check_b有自己的独立内存
```
对于`double`数组和`std::string`类型的成员变量,它们通常在拷贝时会被完全复制,即使是在浅拷贝的情况下也是如此,因为它们不是复杂的数据结构。
阅读全文