解决方案-vector初始化后存放Mat,出现Mat矩阵数据同变问题

简介: 解决方案-vector初始化后存放Mat,出现Mat矩阵数据同变问题

问题说明

      近期在用vector存放Mat数据时发现个很有意思的现象,大概意思是我初始化了一个vector-V,初始内容为10个全1矩阵,然后给V[0]=5*src,src是一个Mat类型的矩阵,此时发现V[1]和[2]也变成了5*src的内容,有兴趣的可以自己试试。


      我个人猜测是因为5*src得到的是一个矩阵算式MatExpr类型,该类型放置在vector中可能会因某些原因使vector内的数据产生同变,后来我用了一个Mat作中间变量,该问题就修复了。

问题复现

      1)定义一个任意Mat类型的矩阵src,数据随意。

cv::Mat src = cv::Mat::zeros(10, 10, CV_32FC1);
for (int i = 0; i < 10; ++i)
{
  for (int j = 0; j < 10; ++j)
  {
    src.at<float>(i, j) = rand() % 255;
  }
}

      2)定义一个vector容器。初始化存放3个全零矩阵。

vector<cv::Mat> V(3, cv::Mat::zeros(src.size(), src.type()));

      3)如图所示,V中的3个Mat全是全零矩阵。

    4)令V的第一个Mat等于5*src。

V[0] = 5 * src;

      5)如图所示,V中的3个Mat全是全变成了5*src,然而此时我还没对后面两个Mat操作,若继续V[1]=6*src,3个Mat就全变成了6*src。

6)若引用一个Mat作为中间变量。

cv::Mat s = 5 * src;
V[0]=s;

 

解决方案

      综上所述,如果你想用vector存放一些Mat,要么采用push_back的方式(该方法放入容器的其实也是Mat),要么就用Mat作中间变量进行矩阵算式,再赋给容器某个位置的Mat。

vector<cv::Mat> V(3, cv::Mat::zeros(src.size(), src.type()));
cv::Mat s = 5 * src;
V[0] = s;

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
计算机视觉
StretchDIBits 直接使用cv::Mat的数据有可能显示错误的问题
StretchDIBits 直接使用cv::Mat的数据有可能显示错误的问题
|
9天前
|
Java Android开发
MAT如何使用?
MAT如何使用?
24 4
|
5月前
|
C++ 容器
C++中向量的操作vector
C++中向量的操作vector
|
4月前
|
计算机视觉 Python
将QImage转化成Mat方法
本文提供了一个将QImage转换为OpenCV Mat格式的Python函数,通过转换QImage到RGB32格式并使用numpy数组重塑来实现转换。
|
6月前
|
存储 算法 API
OpenCV 3.1.0中的Mat对象使用
OpenCV 3.1.0中的Mat对象使用
40 2
|
6月前
|
算法 计算机视觉
如何判断点在多边形内部:OpenCV--cv2.pointPolygonTest()方法详解
如何判断点在多边形内部:OpenCV--cv2.pointPolygonTest()方法详解
|
7月前
使用zeros()函数创建数组
使用zeros()函数创建数组。
81 6
|
7月前
19.把1~100存到二维数组a[10][10]中,并按二维矩阵形式输出
19.把1~100存到二维数组a[10][10]中,并按二维矩阵形式输出
44 0
|
7月前
|
存储 定位技术 计算机视觉
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
|
7月前
|
存储 计算机视觉
OpenCV(三):Mat类数据的读取
OpenCV(三):Mat类数据的读取
196 0