首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将cv::Mat & Img复制到unsigned char* img?opencv

如何将cv::Mat & Img复制到unsigned char* img?opencv
EN

Stack Overflow用户
提问于 2018-08-27 02:19:20
回答 3查看 1.2K关注 0票数 1

如何将"Mat& imgSrc“复制到"unsigned char* imgSrc"?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
}

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2018-08-27 02:52:08

是否有错误消息,或者图像只是“错误”?

有两件明显的事情需要检查,你是否正确地传递了图像的宽度和高度?在相机API (x,y)和图像处理矩阵API (row,col)之间,它是图像中的一个持续的痛苦来源

和opencv将图像行填充到32位(4字节边界)请参阅Stride on image using Opencv C++

票数 0
EN

Stack Overflow用户

发布于 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对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
票数 0
EN

Stack Overflow用户

发布于 2018-08-27 05:45:40

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52031804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文