首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >解决方案-vector初始化后存放Mat,出现Mat矩阵数据同变问题

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

作者头像
全栈程序员站长
发布2022-09-28 11:19:15
发布2022-09-28 11:19:15
5890
举报

大家好,又见面了,我是你们的朋友全栈君。

作者:翟天保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,数据随意。

代码语言:javascript
复制
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个全零矩阵。

代码语言:javascript
复制
vector<cv::Mat> V(3, cv::Mat::zeros(src.size(), src.type()));

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

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

代码语言:javascript
复制
V[0] = 5 * src;

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

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

代码语言:javascript
复制
cv::Mat s = 5 * src;
V[0]=s;

7)此时就只有V[0]变了,注意一般不建议直接=赋值,而是s.clone(),避免对源数据产生影响。

解决方案

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

代码语言:javascript
复制
vector<cv::Mat> V(3, cv::Mat::zeros(src.size(), src.type()));
cv::Mat s = 5 * src;
V[0] = s;

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/192395.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月2日 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题说明
  • 问题复现
  • 解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档