19,468
社区成员
发帖
与我相关
我的任务
分享
#define MAKEWIDTHBYTES( PIXELW, BITCOUNT ) (((( BITCOUNT * PIXELW ) + 31) / 32) * 4)//计算4对齐一行的字节数
int ConvertKSJToOpencv3(unsigned char * pImageData, int nWidth, int nHeight, int nBitCount, Mat **ppcvImg)//ppcvImg在接口调用后需要释放
{
int nLineByte = MAKEWIDTHBYTES(nWidth, nBitCount);//计算4对齐一行的字节数
if (nBitCount == 8)//根据位图深度初始化Mat,构造函数为浅拷贝,随pImageData变化
{
*ppcvImg = new Mat(nHeight, nWidth, CV_8UC1, pImageData, nLineByte);
}
else if (nBitCount == 24)
{
*ppcvImg = new Mat(nHeight, nWidth, CV_8UC3, pImageData, nLineByte);
}
else if (nBitCount == 32)
{
*ppcvImg = new Mat(nHeight, nWidth, CV_8UC3, pImageData, nLineByte);
}
else
{
return -1;
}
flip(**ppcvImg, **ppcvImg, 0);
**ppcvImg = (*ppcvImg)->clone();//深拷贝,ppcvImg不受pImageData影响
return 0;
}
int ConvertOpnecv3ToKSJ(Mat cvImg, unsigned char ** ppImageData)//ppImageData在接口调用后需要释放
{
if (cvImg.step[1] != 1 && cvImg.step[1] != 3 && cvImg.step[1] != 4)
{
return -1;
}
int nLineByte = MAKEWIDTHBYTES(cvImg.cols, cvImg.step[1] * 8);
unsigned char * pTempData = new unsigned char[nLineByte * cvImg.rows];
flip(cvImg, cvImg, 0);
int nWidthByte = cvImg.cols * cvImg.step[1];
for (int i = 0; i < cvImg.rows; i++)//深拷贝,ppImageData不受cvImg影响
{
memcpy(pTempData + i * nLineByte, cvImg.data + i * nWidthByte, nWidthByte);
}
*ppImageData = pTempData;
return 0;
}
调用方式,获取图像数据pImageData,nCaptureWidth, nCaptureHeight, nCaptureBitCount,分别表示宽高位数,cvImg是mat类型:
//使用sdk获取图片宽高位
BYTE *pImageData = new BYTE[nCaptureWidth * nCaptureHeight * (nCaptureBitCount >> 3)];
//使用sdk为pImageData赋值
Mat *cvImg = NULL;
nRet = ConvertKSJToOpencv3(pImageData, nCaptureWidth, nCaptureHeight, nCaptureBitCount, &cvImg);
if (nRet == 0)
{
imwrite("KSJToOpencv.bmp", *cvImg);
}
delete[] pImageData;
pImageData = NULL;
BYTE *pKSJData = NULL;
nRet = ConvertOpnecv3ToKSJ(*cvImg, &pKSJData);
delete cvImg;