如何将 cv::Mat & Img 复制到未签名的 char* img?opencv
How to copy cv::Mat & Img to unsigned char* img?opencv
如何将"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(
现在,将对象的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);
很抱歉,它总是有一些问题,代码是:
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
}