如何将 cv::Mat & Img 复制到未签名的 char* img?opencv

How to copy cv::Mat & Img to unsigned char* img?opencv

本文关键字:char img opencv cv Mat 复制 Img      更新时间:2023-10-16
如何将"Mat& imgSrc">

复制到"unsigned char* imgSrc"?

void BGR2NV21( unsigned char* bgrData, int w, int h, unsigned char* nv21Data)
{.............}
int enhanceRGB( cv::Mat& fieldFaceImgSrc, int iWidth,int iHeight, cv::Mat& faceImgDst)
{
cv::imwrite("enhanceInput.jpg", fieldFaceImgSrc); //it's ok
cv::Mat faceBackupData;
faceBackupData = fieldFaceImgSrc.clone();       //it's ok
cv::imwrite("enhanceput.jpg", faceBackupData);  //it's ok
unsigned char*pcfieldFaceDataNV21 = (unsigned char*)faceBackupData .data;
BGR2NV21(pcfieldFaceDataNV21,                   //it's bad,pcfieldFaceDataNV21  is bad data;
iWidth, iHeight, pcfieldFaceDataNV21);
}

感谢您的帮助。

是否有错误消息或图像只是"错误"?

要检查的两件明显的事情,您是否以正确的方式传递了图像宽度和高度?它是相机 API (x,y( 和图像处理矩阵 API(行,列(之间图像痛苦的持续来源

opencv 将图像行填充到 32 位(4 字节边界(,请参阅使用 Opencv C++ 在图像上跨步

它可能失败的原因之一是关于频道的管理。 OpenCV的Mat对象连续存储数据,如果它们不是子矩阵。 此存储遵循原始行顺序,这意味着:

矩阵: |1 2 3| |4 5 6| |7 8 9|

将按以下顺序存储线性指针:1,2,3,4,5,6,7,8,9。

对于通道也是如此,即让两个像素的值 [255,64,128] 和 [64,12,34] 对应于坐标行 = 0、col =0 和行 =0 col = 1,它们将连续存储在内存中(data的前六个值将是 255,64,128,64,12,34(

现在,将对象的Matdata指针复制到另一个数据指针的最简单方法是:

std::memcpy(dst,src,rows*cols*elemsize);或者如果传递Mat对象:

if(obj.isContiguous())
std::memcpy(dst,src.ptr(),src.rows*src.step); // if you data are of type unsigned char src.step == src.cols otherwise src.step = src.cols*src.elemSize()
else
for(int r=0;r<src.rows;r++,dst+=src.step)
std::memcpy(dst,src.ptr(r),src.step);

很抱歉,它总是有一些问题,代码是:

int enhanceRGB( cv::Mat fieldFaceImgSrc, int iWidth,int iHeight, cv::Mat& faceImgDst)
{
cv::imwrite("enhanceInput.jpg", fieldFaceImgSrc); //it's ok
cv::Mat faceBackupData;
faceBackupData = fieldFaceImgSrc.clone();
cv::imwrite("enhanceput.jpg", faceBackupData);   //it's ok
unsigned char *testdata = (unsigned char*)malloc(iWidth * iHeight * 3 * sizeof(unsigned char));
memcpy(testdata, faceBackupData.ptr(), iWidth * iHeight * 3);
cv::Mat FaceData(iHeight , iWidth, CV_8UC3, testdata);
cv::imwrite("testput.jpg", FaceData);           //it's bad
}