您的位置:首页 > 移动开发 > Objective-C

OpenCV的Mat和Halcon的HObject类型互相转换

2018-02-22 23:33 716 查看
项目之前一直使用的OpenCV,最近有个小问题使用Halcon有更好的效果,于是有了cv::Mat和Halcon中HObject互相转换的需求。参考了博客http://blog.csdn.net/u010627377/article/details/76687178,我使用他的代码的时候出错了,于是在其基础上稍微做了下修改。Halcon的版本是13,OpenCV的版本是3.2。如有问题,欢迎讨论。[cpp] view plain copyHObject 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;  
}  
  
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;  
}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: