• 【转载】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

  • 相关阅读:
    协方差的意义
    ios7新特性实践
    微信支付大盗--黑色产业链
    UVA 297 Quadtrees(四叉树建树、合并与遍历)
    HDU 2876 Ellipse, again and again
    java中接口的定义与实现
    Oracle Linux 6.3下安装Oracle 11g R2(11.2.0.3)
    Fortran使用隐形DO循环和reshape给一维和多维数组赋初值
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
  • 原文地址:https://www.cnblogs.com/xixixing/p/12598191.html
Copyright © 2020-2023  润新知