vector<cv::mat> 数据初始化问题

问题:

采用 vector::resize 初始化 cv::Mat 的数组, 发现其中所有的cv::Mat对象共享同样的数据

std::vector<cv::Mat> imgs;
imgs.resize(num, cv::Mat::zeros(5, 5, CV_32S));
imgs.assign(num, cv::Mat::zeros(5, 5, CV_32S));

这两种做法都会存在改变数组中一个元素,其余元素也会跟着修改的问题。

原因分析:

1,vector使用值初始化,或resize(当前长度不足时)/assign进行类元素填充时,调用都是拷贝构造函数。

#include <vector>
#include <iostream>

class TestClass
{
public:
	TestClass(int a) : a(a)
	{
		std::cout << "Constructor" << std::endl;
	}

	TestClass(const TestClass& t)
	{
		std::cout << "Copy Constructor" << std::endl;
	}

	int a{ 0 };
};

int main()
{
	std::vector<TestClass> vec(3, TestClass(3));
	vec.resize(3, TestClass(3));
	vec.assign(3, TestClass(3));
	/* 这三种初始化方式输出的都是
	Constructor
	Copy Constructor
	Copy Constructor
	Copy Constructor
	*/
	return 0;
}

2,cv::Mat 的拷贝是浅拷贝,创建的新Mat对象与原对象共享同样数据。

解决写法:

1,使用循环, 每个矩阵都被单独分配内存,因此修改一个矩阵不会影响其他矩阵

std::vector<cv::Mat> imgs(num);   
 for (int i = 0; i < num; ++i) 
 {        
     imgs[i] = cv::Mat::zeros(5, 5, CV_32S);  // 每个Mat都是独立的 
 }

2,使用std::fill初始化

std::vector<cv::Mat> imgs(num);
std::fill(imgs.begin(), imgs.end(), cv::Mat::zeros(5, 5, CV_32S));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值