解决方案|解决方案-vector初始化后存放Mat,出现Mat矩阵数据同变问题
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
问题说明 近期在用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 = https://www.it610.com/article/cv::Mat::zeros(10, 10, CV_32FC1);
for (int i = 0;
i < 10;
++i)
{
for (int j = 0;
j < 10;
++j)
{
src.at(i, j) = rand() % 255;
}
}
2)定义一个vector容器。初始化存放3个全零矩阵。
vector 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;
7)此时就只有V[0]变了,注意一般不建议直接=赋值,而是s.clone(),避免对源数据产生影响。
文章图片
解决方案 综上所述,如果你想用vector存放一些Mat,要么采用push_back的方式(该方法放入容器的其实也是Mat),要么就用Mat作中间变量进行矩阵算式,再赋给容器某个位置的Mat。
vector V(3, cv::Mat::zeros(src.size(), src.type()));
cv::Mat s = 5 * src;
V[0] = s;
【解决方案|解决方案-vector初始化后存放Mat,出现Mat矩阵数据同变问题】如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!
推荐阅读
- parallels|parallels desktop 解决网络初始化失败问题
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Spark|Spark 数据倾斜及其解决方案
- 代码不规范容易造成的bug
- 小版隧道镜子解决方案
- 第三天-过拟合欠拟合及其解决方案|第三天-过拟合欠拟合及其解决方案,梯度消失梯度爆炸,
- weex|weex run ios 报错 /bin/sh: pod: command not found 解决方案
- Supported|Supported orientations has no common orientation with the application 解决方案
- Git上传至GitHub
- dCas9技术流程与实验问题解决方案