• opencv Mat与halcon HObject类型的相互转换


    //Mat与halcon类型的转换
    cv::Mat HObject2Mat(HObject Hobj)
    {
      HTuple htCh;
      HString cType;
      cv::Mat Image;
      ConvertImageType(Hobj, &Hobj, "byte");
      CountChannels(Hobj, &htCh);
      Hlong wid = 0;
      Hlong hgt = 0;
      if (htCh[0].I() == 1)
      {
        HImage hImg(Hobj);
        void *ptr = hImg.GetImagePointer1(&cType, &wid, &hgt);//GetImagePointer1(Hobj, &ptr, &cType, &wid, &hgt);
        int W = wid;
        int H = hgt;
        Image.create(H, W, CV_8UC1);
        unsigned char *pdata = static_cast<unsigned char *>(ptr);
        memcpy(Image.data, pdata, W*H);
      }
      else if (htCh[0].I() == 3)
      {
        void *Rptr;
        void *Gptr;
        void *Bptr;
        HImage hImg(Hobj);
        hImg.GetImagePointer3(&Rptr, &Gptr, &Bptr, &cType, &wid, &hgt);
        int W = wid;
        int H = hgt;
        Image.create(H, W, CV_8UC3);
        vector<cv::Mat> VecM(3);
        VecM[0].create(H, W, CV_8UC1);
        VecM[1].create(H, W, CV_8UC1);
        VecM[2].create(H, W, CV_8UC1);
        unsigned char *R = (unsigned char *)Rptr;
        unsigned char *G = (unsigned char *)Gptr;
        unsigned char *B = (unsigned char *)Bptr;
        memcpy(VecM[2].data, R, W*H);
        memcpy(VecM[1].data, G, W*H);
        memcpy(VecM[0].data, B, W*H);
        cv::merge(VecM, Image);
      }
      return Image;
    }

    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 = nullptr;
        dataG = nullptr;
        dataB = nullptr;
      }
      // 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 = nullptr;
      }
      return Hobj;
    }

  • 相关阅读:
    JVM活学活用——GC算法 垃圾收集器
    JVM活学活用——类加载机制
    JVM活学活用——Jvm内存结构
    优化springboot
    Java基础巩固计划
    Java自定义注解
    记一次内存溢出的分析经历
    redis学习笔记-redis的安装
    记一次线程池调优经历
    Python中关于split和splitext的差别和运用
  • 原文地址:https://www.cnblogs.com/DoublearmyLi/p/14283206.html
Copyright © 2020-2023  润新知