OpenCV图像矩阵向量到矩阵

时间:2014-04-09 18:11:32

标签: image opencv vector matrix row

我想做以下事情:

假设我有100张图片。我想将每个图像的矩阵转换为一个向量并构建一个新的矩阵(100行),其中每一行是我们从图像中得到的向量。最好的方法是什么?

2 个答案:

答案 0 :(得分:6)

假设您的所有图片大小相同,

然后使用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));

答案 1 :(得分:5)

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提出的解决方案,但耗时较少。