3

我使用此代码将图像转换为矩阵,所以有人知道如何将此矩阵转换为一维 -> 向量我希望将图像数据作为一维数组,按行主要顺序,即所有像素值在第一行首先列出,然后是第二行中的像素值,依此类推。

IplImage *img = cvLoadImage( "lena.jpg", CV_LOAD_IMAGE_COLOR);
CvMat *mat = cvCreateMat(img->height,img->width,CV_32FC3 );

cvConvert( img, mat );

for(int i=0;i<10;i++)

{

for(int j=0;j<10;j++){


CvScalar scal = cvGet2D( mat,j,i);

printf( "(%.f,%.f,%.f) ",scal.val[0], scal.val[1], scal.val[2] );}


printf("\n");}



cvNamedWindow("une_window");
cvShowImage("une_window", img);

cvWaitKey();

cvDestroyWindow("une_window");
4

4 回答 4

3

使用 C++ API:

   cv::Mat img = cv::imread("a.jpg");

   std::vector<uchar> pixels;
   pixels.reserve(img.rows * img.cols * 3);

   if(img.isContinuous()) {
     pixels = std::vector<uchar>(img.ptr(0), img.ptr(0) + img.rows * img.cols * 3 );
   }
   else {
     for(int i = 0; i != img.rows; ++i) {
       uchar* p = img.ptr(i);
       for(int j = 0; j != img.cols * 3; ++j) {
         pixels.push_back(p[j]);
       }
     }   
   }
于 2012-04-27T15:00:09.003 回答
1

我相信连续垫子的最快方法是使用 reshape 命令:

Mat colVec = img.reshape(1, img.rows*img.cols); // change to a Nx3 column vector

reshape 命令只是更改标题,因此它不需要像素访问,因此在 O(1) 时间内运行。

于 2012-07-24T19:34:37.450 回答
1

我认为您应该从视频解码器输出中观察以了解视频大小信息,从容器解析器中的元数据收集的其他信息可能不那么准确。

于 2012-10-29T08:34:07.210 回答
0

在 C++ 中,这实际上是一个单行:

cv::Mat_<float> img = cv::imread("a.jpg", 1);
std::vector<float> dest;
std::copy(img.begin(), img.end(), dest.begin());
于 2013-04-22T20:47:26.000 回答