vector与mat互转
参考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;
}