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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

作者:翟天保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 = 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全是全零矩阵。

解决方案-vector初始化后存放Mat,出现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。

解决方案-vector初始化后存放Mat,出现Mat矩阵数据同变问题       6)若引用一个Mat作为中间变量。

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

       7)此时就只有V[0]变了,注意一般不建议直接=赋值,而是s.clone(),避免对源数据产生影响。 解决方案-vector初始化后存放Mat,出现Mat矩阵数据同变问题

 

解决方案

       综上所述,如果你想用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;

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea2021.4的激活码_通用破解码

    idea2021.4的激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    105
  • springsession使用_常见的使用null场景

    springsession使用_常见的使用null场景目录一、同域名下相同项目(集群环境)实现Session共享1.思路2.架构图3.实现步骤一、同域名下相同项目(集群环境)实现Session共享在同一个域名下,比如:www.p2p.com同一个项目,部署了多台tomcat,这就是典型的集群。我们上一篇文章的入门案例就属于这种应用场景,只不过在实际开发的过程中,我们如果存在了tomcat集群,那么肯定会使用nginx进行负载均衡,那么这种情况下我们该如何处理。1.思路我们将上一个阶段的p2p项目实现集群部署下的Ses

    2025年6月6日
    3
  • USB转485工业级两线制转换器

    USB转485工业级两线制转换器技术指标单片(ASIC)USB端口到串行端口通信,支持即插即用和热插拔RS485口特性:接口兼容RS485标准,信号:T/R+,T/R-,GND电气接口:DB9针型(公头)连接口加外配接线板,波特率:300bps-921.6Kbps支持串行数据帧格式:8数据位,奇/偶/无校验位,1停止位USB端口提供全速12Mbps的传输速率完全符合U…

    2022年5月27日
    40
  • jvm字符串常量池_java 常量池

    jvm字符串常量池_java 常量池字符串字符串字面量:就是指这个字符串本身,比如”Java”,”Hello”。字符串对象:比如newString(“abc”),或者直接Strings=”str”,后面的”str”也是一个字符串对象。字符串引用:引用就是一个变量,指向对应的字符串对象。常量池class常量池Java源文件编译之后得到的class文件,其中有项信息就是常量池,保存有字面量和符号引用,比如publicclassJ…

    2022年7月28日
    5
  • servlet到底是什么[通俗易懂]

    servlet到底是什么[通俗易懂]servlet到底是什么?对于这个问题一直云里雾里的,今天打算刨根问底。一、Servlet简介  Servlet是sun公司提供的一门用于开发动态web资源的技术。  Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:  1、编写一个Java类,实现servlet接口。  2、把开发好的Java类部署…

    2022年6月15日
    49
  • mediumtext_【紧急求助】关于mediumtext类型数据的调用

    mediumtext_【紧急求助】关于mediumtext类型数据的调用你的位置:问答吧->PHP基础->问题详情【紧急求助】关于mediumtext类型数据的调用请问各位大大,我如何将mediumtext类型的数据调用输入textarea文本框中呢?主要的问题是mediumtext内没有回车完全可以正常调用,但一旦有回车就无法进行调用,文本框中输入不了任何数据!恳请各位大大不…

    2022年6月12日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号