cv::Mat的覆盖拷贝
时间: 2024-09-05 17:01:24 浏览: 68
`cv::Mat`的覆盖拷贝,也叫做深拷贝或赋值,是指创建一个新的矩阵并与原始矩阵共享数据。当你使用赋值运算符`=`将一个`cv::Mat`对象赋给另一个`cv::Mat`变量时,如果底层的内存没有变化,那么这两个变量实际上指向的是同一个内存区域,所以他们的内容会同步更新。
如果你想要复制一个`cv::Mat`而不希望两个对象共享数据,你应该使用`copyTo()`、`clone()`或者`Mat()`构造函数来进行浅拷贝或深拷贝。例如,使用`clone()`函数生成了一个新的`cv::Mat`副本:
```cpp
cv::Mat src = ...; // 原始矩阵
cv::Mat dst(src); // 这是一个浅拷贝,两者共享底层数据
// 或者
cv::Mat dst = src.clone(); // 这是一个深拷贝,新生成一个独立的矩阵
```
相关问题
cv::Mat mat; mat.create(m_height, m_width, CV_8UC3); const cv::Mat buffer_mat(m_height, m_width, CV_16UC1, pBuff); cv::normalize(buffer_mat, mat, 0, 255, cv::NORM_MINMAX, CV_8UC3); cv::Mat dst_mat; cv::cvtColor(mat, dst_mat, cv::COLOR_BayerRG2RGB);优化这段代码
这段代码的主要目的是将一个输入的16位图像数据转换为8位RGB图像。这里有几个可以优化的地方:
1. 避免不必要的临时变量:可以避免使用 buffer_mat 作为临时变量,直接使用 pBuff 进行归一化操作。
2. 减少拷贝次数:可以在创建 mat 时直接使用 pBuff 进行初始化,避免创建一个额外的 16 位图像。
3. 使用 OpenCV 的函数代替手动计算:可以使用 cv::convertScaleAbs 函数代替 cv::normalize 函数进行归一化,在 cv::cvtColor 中使用 cv::COLOR_BayerBG2RGB 代替 cv::COLOR_BayerRG2RGB。
下面是优化后的代码:
```
cv::Mat mat(m_height, m_width, CV_8UC3, pBuff);
cv::convertScaleAbs(mat, mat, 255.0 / std::numeric_limits<uint16_t>::max());
cv::cvtColor(mat, mat, cv::COLOR_BayerBG2RGB);
```
这里使用了 cv::convertScaleAbs 函数直接对 mat 进行归一化,并且在 cv::cvtColor 中使用 cv::COLOR_BayerBG2RGB。
cv::mat 拷贝方式
在 OpenCV 中,可以使用以下方法来拷贝 cv::Mat 对象:
1. 使用 cv::Mat 的 clone() 方法:
```cpp
cv::Mat src = cv::imread("image.jpg");
cv::Mat dst = src.clone();
```
2. 使用 cv::Mat 的 copyTo() 方法:
```cpp
cv::Mat src = cv::imread("image.jpg");
cv::Mat dst;
src.copyTo(dst);
```
3. 使用 cv::Mat 的 assignment 操作:
```cpp
cv::Mat src = cv::imread("image.jpg");
cv::Mat dst = src;
```
需要注意的是,以上三种方法都会创建一个新的 cv::Mat 对象,而不是将指针指向同一块内存。这意味着,在拷贝大型的 cv::Mat 对象时,可能会占用较多的内存。如果要避免这种情况,可以使用 cv::Mat 的指针或引用来进行操作。
阅读全文