grace19891221
助理工程师
助理工程师
  • 最后登录2020-10-19
  • 发帖数252
  • 金币1219枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
阅读:123回复:3

Opencv中 Mat 浮点型图像转 HObject对象遇问题,求指导

楼主#
更多 发布于:2020-10-16 08:53
【问题】根据将整型图像 Mat 转HObject 代码,变更为浮点型图像Mat 转HObject,执行OK,但得到的图像1/4正常,其余部分像素为0,如何能准确获得完整图像?
1. 整型 Mat 转HObject:
HObject Mat2HObject(const cv::Mat &image)
{
     HObject Hobj = HObject();
     int hgt = image.rows;
     int wid = image.cols;
     int i;
     //  CV_8UC3
     if (image.type() == CV_8UC3)
     {
            vector<cv::Mat> imgchannel;
            split(image, imgchannel);
            cv::Mat imgB = imgchannel[0];
            cv::Mat imgG = imgchannel[1];
            cv::Mat imgR = imgchannel[2];
            uchar* dataR = new uchar[hgt*wid];
            uchar* dataG = new uchar[hgt*wid];
            uchar* dataB = new uchar[hgt*wid];
            for (i = 0; i<hgt; i++)
            {
                  memcpy(dataR + wid*i, imgR.data + imgR.step*i, wid);
                  memcpy(dataG + wid*i, imgG.data + imgG.step*i, wid);
                  memcpy(dataB + wid*i, imgB.data + imgB.step*i, wid);
            }
            GenImage3(&Hobj, "byte", wid, hgt, (Hlong)dataR, (Hlong)dataG, (Hlong)dataB);
            delete[]dataR;
            delete[]dataG;
            delete[]dataB;
            dataR = NULL;
            dataG = NULL;
            dataB = NULL;
      }
      //  CV_8UCU1
      else if (image.type() == CV_8UC1)
      {
           uchar* data = new uchar[hgt*wid];
           for (i = 0; i<hgt; i++)
           memcpy(data + wid*i, image.data + image.step*i, wid);
           GenImage1(&Hobj, "byte", wid, hgt, (Hlong)data);
           delete[] data;
           data = NULL;
      }
     return Hobj;
}

2.  浮点型 Mat 转 HObject 代码:
HObject Mat2HObject(const cv::Mat &image)
{
     HObject Hobj = HObject();
     int hgt = image.rows;
     int wid = image.cols;
     int i;
     //  CV_32FC3
     if (image.type() == CV_32FC3)
     {
            vector<cv::Mat> imgchannel;
            split(image, imgchannel);
            cv::Mat imgB = imgchannel[0];
            cv::Mat imgG = imgchannel[1];
            cv::Mat imgR = imgchannel[2];
            float* dataR = new float[hgt*wid];
            float* dataG = new float[hgt*wid];
            float* dataB = new float[hgt*wid];
            for (i = 0; i<hgt; i++)
            {
                  memcpy(dataR + wid*i, imgR.data + imgR.step*i, wid);
                  memcpy(dataG + wid*i, imgG.data + imgG.step*i, wid);
                  memcpy(dataB + wid*i, imgB.data + imgB.step*i, wid);
            }
            GenImage3(&Hobj, "real", wid, hgt, (Hlong)dataR, (Hlong)dataG, (Hlong)dataB);
            delete[]dataR;
            delete[]dataG;
            delete[]dataB;
            dataR = NULL;
            dataG = NULL;
            dataB = NULL;
      }
      //  CV_32FC1
      else if (image.type() == CV_32FC1)
      {
           float* data = new float[hgt*wid];
           for (i = 0; i<hgt; i++)
           memcpy(data + wid*i, image.data + image.step*i, wid);
           GenImage1(&Hobj, "real", wid, hgt, (Hlong)data);
           delete[] data;
           data = NULL;
      }
     return Hobj;
}
3. 执行 浮点型 Mat 转 HObject 代码,获得的图像如下,有效部分 1/4:
4. 暂未找到问题原因,求指导!急急急~
喜欢0

最新打赏:0人

linhaixin2011
助理工程师
助理工程师
  • 最后登录2020-10-19
  • 发帖数70
  • 金币1106枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
沙发#
发布于:2020-10-16 09:28
memcpy(data + wid*i, image.data + image.step*i, wid)改为memcpy(data + wid*i, image.data + image.step*i, wid*sizeof(float));
grace19891221
助理工程师
助理工程师
  • 最后登录2020-10-19
  • 发帖数252
  • 金币1219枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
板凳#
发布于:2020-10-16 10:05
linhaixin2011:memcpy(data + wid*i, image.data + image.step*i, wid)改为memcpy(data + wid*i, image.data + image.step*i, wid*sizeof(float))...回到原帖
感谢,正解!
cwhcwh
技术员
技术员
  • 最后登录2020-10-19
  • 发帖数444
  • 金币364枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
地板#
发布于:2020-10-16 23:52
好厉害,太强了,学习学习~~
游客

返回顶部
支付

欢迎打赏,请选择打赏金额

  • 1元
  • 6元
  • 10元
  • 66元
  • 100元

支付即代表同意《本站支付协议》 有疑问请联系客服