opencv 如何定义数组_opencv中的Mat与数组互转

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

cv::Mat TransBufferToMat(unsigned char* pBuffer, int nWidth, int nHeight, int nBandNum, int nBPB = 1)

{

cv::Mat mDst;

if (nBandNum == 4)

{

if (nBPB == 1)

{

mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC4);

}

else if (nBPB == 2)

{

mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC4);

}

}

else if (nBandNum == 3)

{

if (nBPB == 1)

{

mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC3);

}

else if (nBPB == 2)

{

mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC3);

}

}

else if (nBandNum == 1)

{

if (nBPB == 1)

{

mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC1);

}

else if (nBPB == 2)

{

mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC1);

}

}

for (int j = 0; j < nHeight; ++j)

{

unsigned char* data = mDst.ptr(j);

unsigned char* pSubBuffer = pBuffer + (nHeight - 1 - j) * nWidth  * nBandNum * nBPB;

memcpy(data, pSubBuffer, nWidth * nBandNum * nBPB);

}

if (nBandNum == 1)

{

cv::cvtColor(mDst, mDst, CV_GRAY2BGR);

}

else if (nBandNum == 3)

{

cv::cvtColor(mDst, mDst, CV_RGB2BGR);

}

else if (nBandNum == 4)

{

cv::cvtColor(mDst, mDst, CV_RGBA2BGR);

}

return mDst;

}

int TransMatToBuffer(cv::Mat mSrc, unsigned char** ppBuffer, int& nWidth, int& nHeight, int& nBandNum, int& nBPB)

{

if (*ppBuffer)

{

delete[] * ppBuffer;

*ppBuffer = nullptr;

}

nWidth = mSrc.cols;

//nWidth = ((nWidth + 3) / 4) * 4;

nHeight = mSrc.rows;

nBandNum = mSrc.channels();

nBPB = (mSrc.depth() >> 1) + 1;

size_t nMemSize = nWidth * nHeight * nBandNum * nBPB;

//这样可以改变外部*pBuffer的值

*ppBuffer = new uchar[nMemSize];

memset(*ppBuffer, 0, nMemSize);

uchar* pT = *ppBuffer;

for (int j = 0; j < nHeight; ++j)

{

unsigned char* data = mSrc.ptr(j);

unsigned char* pSubBuffer = *ppBuffer + (j)* nWidth  * nBandNum * nBPB;

memcpy(pSubBuffer, data, nWidth * nBandNum * nBPB);

}

return 0;

}更多的交流,欢迎加入 暗号271888395


版权声明:本文为weixin_29988441原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。