vector与mat互转

发布时间 2023-03-22 21:14:15作者: kuaqi

参考1

一、Mat转vector

1、生成1xN的vector对象

1)Mat对象直接转换成vector对象

(1)主要是将Mat对象转换为单通道、单行的Mat对象!然后就可以直接转换成vector对象

Mat src = imread("a.jpg");
// 通用转换
vector<int> v = src.reshape(1, 1)
// 如果src是单通道
vector<int> v = src.reshape(0, 1)

2)获取Mat对象的单列

vector<int> c = src.col(0).reshape(1)

2、生成3xN的vector对象

vector<vector<float>> mat2vec(Mat img, cv::Size2d size = { 512, 512 })
{
	resize(img, img, size);
	cvtColor(img, img, cv::COLOR_BGR2RGB);
	img.convertTo(img, CV_32FC3);
	img = img / 255.0;
	vector<Mat> mv;
	// 三通道分开处理
	split(img, mv);
	vector<float> R = mv[0].reshape(1, 1);
	vector<float> G = mv[1].reshape(1, 1);
	vector<float> B = mv[2].reshape(1, 1);
	// R、G、B三通道数据合并
	vector<vector<float>> outData;
	outData.emplace_back(vector<float>(R.begin(), R.end()));
	outData.emplace_back(vector<float>(G.begin(), G.end()));
	outData.emplace_back(vector<float>(B.begin(), B.end()));
	return outData;
}

二、vector转mat

1、1xN的vector对象转单通道Mat对象

// 直接用vector对象构造Mat对象
vector<float> input({1,2,3});
Mat m = Mat(input);

2、类型float的vector对象转三通道Mat对象

bool vec2mat(vector<vector<float>>& input, Mat& output)
{
	if (input.size() != 3) {
		return false;
	}
	Mat r = Mat(input[0]);
	Mat g = Mat(input[1]);
	Mat b = Mat(input[2]);
	vector<Mat> bgr{ b,g,r };
	merge(bgr, output);
	return true;
}