cv::Mat 浅拷贝 c++
时间: 2024-01-06 18:04:08 浏览: 126
在C++中,cv::Mat对象的默认拷贝构造函数执行的是浅拷贝。浅拷贝意味着只复制指向数据的指针,而不是复制数据本身。
如果你执行类似下面的代码:
```cpp
cv::Mat src = cv::imread("image.jpg");
cv::Mat dst = src;
```
那么`src`和`dst`将指向同一块内存,任何对`dst`的修改都会影响到`src`。这是因为它们共享相同的数据指针。
如果你想执行深拷贝,即复制整个数据,可以使用`cv::Mat`的`clone()`函数:
```cpp
cv::Mat src = cv::imread("image.jpg");
cv::Mat dst = src.clone();
```
这样,`src`和`dst`将有各自独立的内存副本,对其中一个的修改不会影响到另一个。
另外,还可以使用赋值运算符来进行深拷贝:
```cpp
cv::Mat src = cv::imread("image.jpg");
cv::Mat dst;
dst = src.clone();
```
这样也能实现深拷贝的效果。
相关问题
c++将一个cv::mat的变量a赋值给另一个cv::Mat b,如何才能在改动b的情况下,不动a
在 OpenCV(C++)中,`cv::Mat` 类型的变量通常是引用类型,这意味着当你把一个 `cv::Mat` 的变量赋值给另一个时,实际上是共享内存。如果你直接赋值 `a = b`,那么修改 `b` 会直接影响到 `a`。如果你想在改动 `b` 时不影响 `a`,你需要创建 `b` 的副本或者浅拷贝 `a` 到 `b`。
以下是两种常见的方式:
1. **深拷贝**(如果 `b` 所需的资源允许):
```cpp
cv::Mat b(a.size(), a.type(), a.isContinuous() ? a.data : cv::Mat()); // 创建一个新的 Mat 并复制 a 的内容
// 现在,修改 b 不会影响 a
```
2. **浅拷贝**(适用于只读或者不需要修改的情况):
```cpp
cv::Mat b(a); // 这是一个浅拷贝,两个矩阵共享底层数据,因此直接赋值即可
// 修改 b 仍会影响 a,除非你在修改前先复制一份 a
```
为了完全隔离 `a` 和 `b`,你应该在需要修改的地方复制 `a`:
```cpp
cv::Mat temp = a.clone(); // 克隆一份原始的 a
b = temp; // 现在可以放心地修改 b,不会影响原始的 a
```
c++实现opencv中cv::Mat和std::vector相互转换
在C++中,可以使用模板方法来实现cv::Mat和std::vector之间的相互转换。具体的实现代码如下:
```
template<typename _Tp>
std::vector<_Tp> convert_mat_to_vector(const cv::Mat& mat) {
// 通道数不变,按行转为一行
return (std::vector<_Tp>)(mat.reshape(1, 1));
}
template<typename _Tp>
cv::Mat convert_vector_to_mat(std::vector<_Tp> v, int channels, int rows) {
// 将vector变成单列的mat,这里需要clone(),因为这里的赋值操作是浅拷贝
cv::Mat mat = cv::Mat(v).clone();
cv::Mat dest = mat.reshape(channels, rows);
return dest;
}
```
上述代码定义了两个模板方法,分别为convert_mat_to_vector和convert_vector_to_mat。convert_mat_to_vector方法将cv::Mat转换为std::vector,而convert_vector_to_mat方法将std::vector转换为cv::Mat。使用这些方法可以实现cv::Mat和std::vector之间的相互转换。
注意:在转换过程中,需要确保通道数和行数的正确性。在转换cv::Mat为std::vector时,使用reshape方法将多通道的cv::Mat转为一行;在转换std::vector为cv::Mat时,使用reshape方法将一行的std::vector转为指定的通道数和行数。
希望对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换](https://blog.csdn.net/HW140701/article/details/131064164)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *3* [opencv mat与std::vector互转](https://blog.csdn.net/qq_61862078/article/details/128883907)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文