快速像素访问 opencv

Fast Pixels Access opencv

本文关键字:opencv 访问 像素      更新时间:2023-10-16

我用这段代码将图像转换为矩阵,所以有人知道如何将这个矩阵转换为一维矩阵 -->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");

使用 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]);
       }
     }   
   }
我相信

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

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

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

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

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

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