如何将"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);
}
谢谢你的帮助。
发布于 2018-08-27 02:52:08
是否有错误消息,或者图像只是“错误”?
有两件明显的事情需要检查,你是否正确地传递了图像的宽度和高度?在相机API (x,y)和图像处理矩阵API (row,col)之间,它是图像中的一个持续的痛苦来源
和opencv将图像行填充到32位(4字节边界)请参阅Stride on image using Opencv C++
发布于 2018-08-27 05:31:22
它可能失败的原因之一是关于通道的管理。如果数据不是子矩阵,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,对应于坐标row = 0,col =0和row =0 col =1,它们将连续存储在存储器中( data
的前六个值将是255,64,128,64,12,34)
现在,将Mat
对象的data
指针复制到另一个数据指针的最简单方法是:
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);
发布于 2018-08-27 05:45:40
所以很抱歉,它总是有一些问题,代码是:
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
}
https://stackoverflow.com/questions/52031804
复制相似问题