解决方案-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;

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Python学习之MacBook Pro中PyCharm安装pip以及itchat

    Python学习之MacBook Pro中PyCharm安装pip以及itchat前言:Mac中自带的python没有用,自己安装了一个PyCharm,网上很多人说安装Itchat后会安装到自带的Python中去。本文记录怎么安装到自己安装的Python3.7中去。主要技术来源于https://www.cnblogs.com/ace722/p/9697331.html,在此引用并表示感谢,以下只是精炼的步骤,具体可参考原博客。步骤一:首先查看自己是否有安装到pip,在Ter…

  • python进制转换函数-Python中进制转换函数的使用

    python进制转换函数-Python中进制转换函数的使用Python中进制转换函数的使用关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制)、bin()(十进制转换到二进制)、oct()(十进制转换到八进制)、hex()(十进制转换到十六进制)。下面我们逐个说下每个函数的用法。binbin()函数,是将十进制的数字转换成二进制的数字。其中bin()函数中传入的是十进…

  • geoip_GeoIP技术:简介

    geoipTheGeoIPtechnologyenablesawebmastertograbusefulinformationaboutthelocationofthevisitorsusingtheirwebsite.Ithelpsindeterminingthecountry,city,areacodeetc.aboutaspe…

  • Python-pandas的fillna()方法-填充空值[通俗易懂]

    Python-pandas的fillna()方法-填充空值[通俗易懂]0.摘要pandas中fillna()方法,能够使用指定的方法填充NA/NaN值。1.函数详解函数形式:fillna(value=None,method=None,axis=None,inplace=False,limit=None,downcast=None,**kwargs)参数:value:用于填充的空值的值。method:{‘backfill’,…

  • 游戏建模,室内设计哪个更有前景?[通俗易懂]

    游戏建模,室内设计哪个更有前景?[通俗易懂]游戏建模职业分类及发展:进入游戏建模行业你可以选择不同的发展方向,比如:(1)手绘3D美术设计师:制作纯手绘风格游戏的所有3D物品如:角色、道具、建筑、山体;(2)次世代3D美术设计师:制作写实次世代风格游戏的所有3D物品,如:角色、道具、建筑。(3)关卡设计师:根据游戏风格要求,使用模型资源,搭建3D游戏世界(4)模型师:制作3D打印、影视动画中的所有模型。如:角色、道具、建筑、山体。次世代美术设计师做什么?次世代游戏:“次世代游戏”指代和同类游戏相比下更加先进的游戏,即“下一代游戏”。

  • 设计模式(二十一)状态模式

    设计模式(二十一)状态模式

发表回复

您的电子邮箱地址不会被公开。

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