我想做以下事情:
假设我有100张图片。我想将每个图像的矩阵转换为一个向量,并构建一个新的矩阵(100行),其中每行都是我们从图像中得到的向量。最好的方法是什么?
假设所有图像的大小相同,
然后使用Mat::push_back(),您可以将每个图像逐行存储到一个新的Mat中,但您需要使用Mat::reshape()将源图像重塑为一行。稍后,您可以使用Mat::row访问每一行(将是您的源图像),但同样需要根据您的源大小进行整形。
请参阅以下示例。
加载相同大小和通道的源图像。
Mat src1=imread("a.jpg",1);
Mat src2=imread("b.jpg",1);
Mat src3=imread("c.jpg",1);
逐行将每个源Mat推回到一个新的Mat,在这里,您需要将源重塑为单行Mat,因为结果Mat中的每一行都应该代表每个源图像。
Mat A;
A.push_back(src1.reshape(0,1)); //0 makes channel unchanged and 1 makes single row
A.push_back(src2.reshape(0,1));
A.push_back(src3.reshape(0,1));
稍后使用A.row(index).clone()
访问A中的每一行,并将其重塑为原始大小,
Mat B;
B = A.row(0).clone();
imshow("src1",B.reshape(0,src1.rows));
B = A.row(1).clone();
imshow("src2",B.reshape(0,src1.rows));
B = A.row(2).clone();
imshow("src3",B.reshape(0,src1.rows));
vector<Mat> images;
// fill it with data
Mat matVec(images.size(), images[0].cols*images[0].rows, images[0].type());
for(unsigned int i=0; i<images.size(); i++)
(images[i].reshape(0,1)).copyTo(matVec.row(i));
这个解决方案是基于Haris提出的解决方案,但它在一定程度上不太耗时。