当前位置:   article > 正文

opencv中的Mat与数组互转_cv::mat 指向一个buffer

cv::mat 指向一个buffer

直接上代码,初步验证测试正确,数组形式与opencv的存储方式一致为BGR。

  1. cv::Mat TransBufferToMat(unsigned char* pBuffer, int nWidth, int nHeight, int nBandNum, int nBPB = 1)
  2. {
  3.     cv::Mat mDst;
  4.     if (nBandNum == 4)
  5.     {
  6.         if (nBPB == 1)
  7.         {
  8.             mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC4);
  9.         }
  10.         else if (nBPB == 2)
  11.         {
  12.             mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC4);
  13.         }
  14.     }
  15.     else if (nBandNum == 3)
  16.     {
  17.         if (nBPB == 1)
  18.         {
  19.             mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC3);
  20.         }
  21.         else if (nBPB == 2)
  22.         {
  23.             mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC3);
  24.         }
  25.     }
  26.     else if (nBandNum == 1)
  27.     {
  28.         if (nBPB == 1)
  29.         {
  30.             mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC1);
  31.         }
  32.         else if (nBPB == 2)
  33.         {
  34.             mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC1);
  35.         }
  36.     }
  37.     for (int j = 0; j < nHeight; ++j)
  38.     {
  39.         unsigned char* data = mDst.ptr<unsigned char>(j);
  40.         unsigned char* pSubBuffer = pBuffer + (nHeight - 1 - j) * nWidth  * nBandNum * nBPB;
  41.         memcpy(data, pSubBuffer, nWidth * nBandNum * nBPB);
  42.     }
  43.     if (nBandNum == 1)
  44.     {
  45.         cv::cvtColor(mDst, mDst, CV_GRAY2BGR);
  46.     }
  47.     else if (nBandNum == 3)
  48.     {
  49.         cv::cvtColor(mDst, mDst, CV_RGB2BGR);
  50.     }
  51.     else if (nBandNum == 4)
  52.     {
  53.         cv::cvtColor(mDst, mDst, CV_RGBA2BGR);
  54.     }
  55.     return mDst;
  56. }
  57. int TransMatToBuffer(cv::Mat mSrc, unsigned char** ppBuffer, int& nWidth, int& nHeight, int& nBandNum, int& nBPB)
  58. {
  59.     if (*ppBuffer)
  60.     {
  61.         delete[] * ppBuffer;
  62.         *ppBuffer = nullptr;
  63.     }
  64.     nWidth = mSrc.cols;
  65.     //nWidth = ((nWidth + 3) / 4) * 4;
  66.     nHeight = mSrc.rows;
  67.     nBandNum = mSrc.channels();
  68.     nBPB = (mSrc.depth() >> 1) + 1;
  69.     size_t nMemSize = nWidth * nHeight * nBandNum * nBPB;
  70.     //这样可以改变外部*pBuffer的值
  71.     *ppBuffer = new uchar[nMemSize];
  72.     memset(*ppBuffer, 0, nMemSize);
  73.     uchar* pT = *ppBuffer;
  74.     for (int j = 0; j < nHeight; ++j)
  75.     {
  76.         unsigned char* data = mSrc.ptr<unsigned char>(j);
  77.         unsigned char* pSubBuffer = *ppBuffer + (j)* nWidth  * nBandNum * nBPB;
  78.         memcpy(pSubBuffer, data, nWidth * nBandNum * nBPB);
  79.     }
  80.     return 0;
  81. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/42466
推荐阅读
相关标签
  

闽ICP备14008679号