快速像素访问opencv

时间:2012-04-27 14:47:29

标签: c++ opencv

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

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 个答案:

答案 0 :(得分: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]);
       }
     }   
   }

答案 1 :(得分:1)

我认为连续Mats的最快方法是使用reshape命令:

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

cv::Mat_<float> img = cv::imread("a.jpg", 1);
std::vector<float> dest;
std::copy(img.begin(), img.end(), dest.begin());