Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将Mat对象推回到向量的安全方法

将Mat对象推回到向量的安全方法
EN

Stack Overflow用户
提问于 2014-04-08 10:27:20
回答 3查看 4.8K关注 0票数 3

我有个空洞的问题因为发生了一些很奇怪的事情。我正在尝试将Mat对象推向一个向量。例如:

代码语言:javascript
运行
AI代码解释
复制
int main()
{
vector<Mat_<float>> a;
Mat M(2,1, CV_32FC1, Scalar(100));
Mat K(2,1, CV_32FC1, Scalar(150));
Mat b;
b=K-M;
a.push_back(b);
b=K+M;
a.push_back(b);

cout<<a[0]<<endl<<endl;
cout<<a[1]<<endl<<endl;

system("pause");
}

这个不能很好的工作,因为我的矢量只包含b=K+M .In。我认为这是意料之中的,因为我每次只push_back头,如果数据改变,这会影响vector.The中的两个Mats,如果我使用a.push_back(b).clone,问题就解决了。现在,当我像这样运行代码时(将CV_32FC1改为CV_8UC1):

代码语言:javascript
运行
AI代码解释
复制
    int main()
{
vector<Mat_<float>> a;
Mat M(2,1, CV_8UC1, Scalar(100));
Mat K(2,1, CV_8UC1, Scalar(150));
Mat b;
b=K-M;
a.push_back(b);
b=K+M;
a.push_back(b);

cout<<a[0]<<endl<<endl;
cout<<a[1]<<endl<<endl;

system("pause");
}

最后一个向量包含了我推回的两个矩阵,这可能会发生?也许我也不知道第一种情况到底发生了什么,但我找不到任何其他方法来安全地将Mat对象传递给一个向量(就像在这个例子中一样),而不使用in.How ()。

EN

回答 3

Stack Overflow用户

发布于 2014-04-08 11:04:30

将cv::Mat类型从CV_32FC1更改为CV_8UC1不会更改任何内容-在添加到向量时,您仍然执行了标题复制。这是我们所期望和期望的。默认情况下,opencv会避免复制整个矩阵数据。如果你想将元素存储在向量中,并且它们之间的值是不同的,那么你必须使用()。这就像是一个证据。假设您没有使用clone(),并且仍然希望根据向量中的矩阵的值来区分它们。在我看来,这似乎是一种矛盾。Opencv Mat的工作方式类似于智能指针。它存储数据,直到变量的引用计数变为0。因此,您可以按照您自己在问题中注意到的那样安全地执行以下操作:

代码语言:javascript
运行
AI代码解释
复制
b=K-M;
a.push_back(b.clone());
b=K+M;
a.push_back(b);
票数 7
EN

Stack Overflow用户

发布于 2014-04-08 11:05:06

在第二种情况下,您正在创建一个std::vector,它应该包含cv::Mat_<float>类型的元素,但是您正在向其中添加cv::Mat_<unsigned char>类型的元素。因此,您面临的是未定义的行为。

如果要创建CV_8UC1类型的矩阵,则应该将它们放在std::vector< cv::Mat_<unsigned char> >类型的向量中。

您还可以通过使用cv::Mat类型而不是cv::Mat_来使其成为泛型。

代码语言:javascript
运行
AI代码解释
复制
std::vector<cv::Mat> a;
票数 3
EN

Stack Overflow用户

发布于 2016-03-19 16:09:01

正如他们已经说过的,默认情况下cv::Mat不复制,相反,他们尽可能多地使用已经分配的数据,在你的代码中b被使用了两次。另一种解决方案是直接使用push_back(K-M)(K+M),您可以在我的代码中看到。如果你想弄清楚,你可以使用push_back(cv::Mat_<float>(K-M))来说明你每次都会构造一个新的cv::Mat

代码语言:javascript
运行
AI代码解释
复制
int main() {
    vector<Mat_<float>> a;
    Mat M(2, 1, CV_32FC1, Scalar(100));
    Mat K(2, 1, CV_32FC1, Scalar(150));
    a.push_back(K-M);
    a.push_back(K+M);

    cout << a[0] << endl << endl;
    cout << a[1] << endl << endl;

    system("pause");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22934261

复制
相关文章
vb.net ExcelHelper类(三)
Public Sub InsertRows(rowIndex As Integer, count As Integer)
办公魔盒
2019/07/22
1K0
vb.net ExcelHelper类(一)
''' 暂时不提供操作Excel对象样式方法,样式可以在Excel模板中设置好
办公魔盒
2019/07/22
1.3K0
vb.net ExcelHelper类(二)
''' <param name="sheetIndex">工作表索引</param>
办公魔盒
2019/07/22
1.2K0
Lambda序列化支持debugger
代码仓库:https://gitee.com/VampireAchao/stream-query
阿超
2022/08/20
3230
Lambda序列化支持debugger
VB.NET 对ini配置文件操作类
.ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式,统管windows的各项配置,一般用户就用windows提供的各项图形化管理界面就可实现相同的配置了。但在某些情况,还是要直接编辑ini才方便,一般只有很熟悉windows才能去直接编辑。
办公魔盒
2019/07/22
1.5K0
VB.NET 对ini配置文件操作类
Dubbo 支持哪些序列化协议?
dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?
李红
2019/05/29
1.6K0
C#序列化反序列化帮助类
//转载:http://hi.baidu.com/fxh19860822/blog/item/df35230b3ded441495ca6bd5.html 在C#中常见的序列化的方法主要也有三个:BinaryFormatter、SoapFormatter、XML序列化 /// <summary> /// 提供序列化和反序列化对象的相关静态方法。 /// </summary> public class SerializerHelper { ///
跟着阿笨一起玩NET
2018/09/18
1.6K0
Dubbo支持的通信、序列化协议
默认就是走dubbo协议的,单一长连接,NIO异步通信,基于hessian作为序列化协议。
JavaEdge
2022/11/30
4480
Dubbo支持的通信、序列化协议
python 类支持with调用
为了让一个对象兼容 with 语句,你需要实现 __enter__() 和 __exit__() 方法。 例如,考虑如下的一个类,它能为我们创建一个网络连接:
用户5760343
2019/12/13
9620
dubbo 支持哪些通信协议?支持哪些序列化协议?
序列化,就是把数据结构或者是一些对象,转换为二进制串的过程,而反序列化是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
IT技术小咖
2019/06/26
1.5K0
dubbo 支持哪些通信协议?支持哪些序列化协议?
模型类序列化器ModelSerializer
如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。
小闫同学啊
2019/07/18
6280
java序列化反序列化工具类SerializeUtils.java
Redis不支持直接将Java对象存储到数据库中,所以需要将java对象进行序列化得到字节数组,然后将字节数组存入到redis中,需要数据的时候就从redis数据库中取出字节数组,再经过反序列化将自己数组转换成对象使用(jdk序列化性能比谷歌公司的Protobuf序列化性能要差一些,而且序列化后的字节长度要也会长一些,所以推荐使用Protobuf.
IT工作者
2022/05/06
6580
JSON类库Jackson优雅序列化Java枚举类
在Java开发中我们为了避免过多的魔法值,使用枚举类来封装一些静态的状态代码。但是在将这些枚举的意思正确而全面的返回给前端却并不是那么顺利,我们通常会使用Jackson类库序列化对象为JSON,今天就来讲一个关于使用Jackson序列化枚举的通用性技巧。
码农小胖哥
2020/06/28
5.4K0
[PHP]实体类基类和序列化__sleep问题
1.构造函数传参 2.__get和__set实现,当调用不存在的属性的时候,可以取值和赋值到data属性数组 3.__sleep实现,当序列化对象的时候,只序列化data属性数组和类内初始化定义的字段 4.__isset实现,可以判断属性是否存在,通过判断data属性数组 5.toArray方法实现,返回data属性数组 6.记录了构造初始化后,动态添加的属性字段
唯一Chat
2019/09/10
5150
StreamingPro 支持类SQL DSL
受spark sql在喜马拉雅的使用之xql 这篇文章影响,我发现类似下面这种语法是极好的:
用户2936994
2018/08/27
5030
VB.NET 对SQLite轻型数据库操作的SQLiteHelp类
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起MysqlPostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。
办公魔盒
2019/07/22
3.4K0
VB.NET 对SQLite轻型数据库操作的SQLiteHelp类
制作最清晰缩略图的完整类(VB.NET版)
Public Class ClassUpPic    Private vPicFile As Sys
Java架构师必看
2021/03/22
4850
浅谈VB.NET[通俗易懂]
前一段时间好多同学都分享了如何高效看视频的学习方法,第一条就是在看视频之前,对视频中所讲的内容有一个大致的了解。看VB.NET 视频,首先我们就要了解一下VB.NET是什么,它是用来干什么的。
全栈程序员站长
2022/08/09
2K0
浅谈VB.NET[通俗易懂]
Kafka 中使用 Avro 序列化框架(一):使用传统的 avro API 自定义序列化类和反序列化类
关于 avro 的 maven 工程的搭建以及 avro 的入门知识,可以参考: Apache Avro 入门
CoderJed
2018/09/13
2.6K0
Kafka 中使用 Avro 序列化框架(一):使用传统的 avro API 自定义序列化类和反序列化类
Dubbo 支持的几个主流序列化框架评测
今天要聊的技术是序列化,这不是我第一次写序列化相关的文章了,今天动笔之前,我还特地去博客翻了下我博客早期的一篇序列化文章(如下图),竟然都过去 4 年了。
kirito-moe
2021/09/08
1.8K0
Dubbo 支持的几个主流序列化框架评测

相似问题

vb.net序列化类

23

通过序列化支持的Singleton类

11

VB.Net创建要序列化的类

10

将VB.Net Xml反序列化为类

31

VB.net -序列化具有事件的类

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文