OpenCV 读取内存图片

发布时间 2023-08-22 14:44:37作者: DoubleLi

方法一(适用于OpenCV3):

 
 
  1.  
     
    1.  
      #include <opencv2/opencv.hpp>
    2.  
      #include <opencv2/imgproc/imgproc_c.h>
    3.  
      #include <iostream>
    4.  
       
    5.  
      char * lpFileBuf = GetFileBuf("girl.bmp");
    6.  
       
    7.  
      CvMat mCvmat = cvMat(512*3, 768*3, CV_8UC1, lpFileBuf);
    8.  
      IplImage*IpImg = cvDecodeImage(&mCvmat, 1);
    9.  
       
    10.  
      //opencv 2.0 CvMat->Mat数据转换 //Mat b = Mat(mat,true);
    11.  
      //opencv3.0 CvMat->Mat数据转换 //Mat image = cvarrToMat(pp);
    12.  
       
    13.  
      Mat image = cvarrToMat(IpImg).clone();
    14.  
      cvReleaseImage(&IpImg);
    15.  
       
    16.  
      imshow("123", image);
     
     

    方法二(适用于OpenCV4):

  2.  
    1.  
      #include <opencv2/opencv.hpp>
    2.  
      cv::_InputArray pic_arr(bmpFileBuf, nBmpBufSize);
    3.  
      cv::Mat src_mat = cv::imdecode(pic_arr, cv::IMREAD_UNCHANGED);
    4.  
      cv::imshow("123", src_mat);
     
     

    opencv从内存中读取图片可以大大减少读取文件所消耗的时间。

    CvMat中的data数据只是矩阵数据的首地址,分配的内存大小为行列乘积。对该内存块的操作需要调用函数,也可以使用指针索引。

找到了 opencv加载内存中的图片数据的方法,现在记录下来。

 
 
//参数分别为 图片宽度,高度,类型,图片数据指针(unsigned char*)
 
//这个构造函数并没有从新分配内存
 
CvMat mCvmat = cvMat(w, h, CV_8UC1, mImgData);
 
 
 
IplImage* IpImg = cvDecodeImage(&mCvmat, 1);
 
 
 
//opencv3.0 IplImage到Mat类型的转换的方法
 
Mat image = cvarrToMat(IpImg);
 
 
 
if (!image.data)
 
{
 
 
 
return false;
 
}
 
cvReleaseImage(&IpImg);