• 【转载】Halcon中的HObject类型转OpenCV中的Mat类型


    HObject→Mat

    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 *R2 = (unsigned char *)Rptr;
            unsigned char *G = (unsigned char *)Gptr;
            unsigned char *B = (unsigned char *)Bptr;
            memcpy(VecM[2].data, R2, W*H);
            memcpy(VecM[1].data, G, W*H);
            memcpy(VecM[0].data, B, W*H);
            cv::merge(VecM, Image);
        }
        return Image;
    }

    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;
    }

    【转载】https://blog.csdn.net/qq_38815760/article/details/88759919

  • 相关阅读:
    javaee 第六周作业
    javaee 第五周作业
    javaee 第四周作业
    第三周作业
    第二周作业xml学习情况
    javaWeb 中http请求 get 与 post的区别
    第八周
    第七周
    第六周
    第五周
  • 原文地址:https://www.cnblogs.com/xixixing/p/12598191.html
Copyright © 2020-2023  润新知