美文网首页
opencv和halcon图像数据类型相互转换

opencv和halcon图像数据类型相互转换

作者: 卡拉肖克_潘 | 来源:发表于2020-06-19 17:16 被阅读0次

    halcon转opencv需要1.7ms,opencv转halcon需要30ms。

    #include "HalconCpp.h"  
    #include "opencv2/opencv.hpp"
    using namespace cv;
    using namespace std;
    using namespace HalconCpp;
    
    
    HObject Mat2HObject(Mat& image)
    {
        HObject Hobj = HObject();
        int hgt = image.rows;
        int wid = image.cols;
        int i;
        //  CV_8UC3
        if (image.type() == CV_8UC3)
        {
            vector<Mat> imgchannel;
            split(image, imgchannel);
            Mat imgB = imgchannel[0];
            Mat imgG = imgchannel[1];
            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;
    }
    
    Mat HObject2Mat(HObject Hobj)
    {
        HTuple htCh = HTuple();
        HTuple cType;
        Mat Image;
        ConvertImageType(Hobj, &Hobj, "byte");
        CountChannels(Hobj, &htCh);
        HTuple wid;
        HTuple hgt;
        int W, H;
        if (htCh[0].I() == 1)
        {
            HTuple ptr;
            GetImagePointer1(Hobj, &ptr, &cType, &wid, &hgt);
            W = (Hlong)wid;
            H = (Hlong)hgt;
            Image.create(H, W, CV_8UC1);
            uchar* pdata = (uchar*)(Hlong)ptr[0].I();
            memcpy(Image.data, pdata, W*H);
        }
        else if (htCh[0].I() == 3)
        {
            HTuple ptrR, ptrG, ptrB;
            GetImagePointer3(Hobj, &ptrR, &ptrG, &ptrB, &cType, &wid, &hgt);
            W = (Hlong)wid;
            H = (Hlong)hgt;
            Image.create(H, W, CV_8UC3);
            vector<Mat> vecM(3);
            vecM[2].create(H, W, CV_8UC1);
            vecM[1].create(H, W, CV_8UC1);
            vecM[0].create(H, W, CV_8UC1);
            uchar* pr = (uchar*)(Hlong)ptrR[0];
            uchar* pg = (uchar*)(Hlong)ptrG[0];
            uchar* pb = (uchar*)(Hlong)ptrB[0];
            memcpy(vecM[2].data, pr, W*H);
            memcpy(vecM[1].data, pg, W*H);
            memcpy(vecM[0].data, pb, W*H);
            merge(vecM, Image);
        }
        return Image;
    }
    HObject IplImageToHImage(cv::Mat& pImage)
    {
        HObject Hobj;
        if (3 == pImage.channels())
        {
            cv::Mat pImageRed, pImageGreen, pImageBlue;
            std::vector<cv::Mat> sbgr(3);
            cv::split(pImage, sbgr);
    
            int length = pImage.rows * pImage.cols;
            uchar *dataBlue = new uchar[length];
            uchar *dataGreen = new uchar[length];
            uchar *dataRed = new uchar[length];
    
            int height = pImage.rows;
            int width = pImage.cols;
            for (int row = 0; row < height; row++)
            {
                uchar* ptr = pImage.ptr<uchar>(row);
                for (int col = 0; col < width; col++)
                {
                    dataBlue[row * width + col] = ptr[3 * col];
                    dataGreen[row * width + col] = ptr[3 * col + 1];
                    dataRed[row * width + col] = ptr[3 * col + 2];
                }
            }
            double t = (double)getTickCount();
            GenImage3(&Hobj, "byte", width, height, (Hlong)(dataRed), (Hlong)(dataGreen), (Hlong)(dataBlue));
            t = (double)getTickCount() - t;
            t = t*1000. / cv::getTickFrequency();
            cout << t << endl;
            
            delete[] dataRed;
            delete[] dataGreen;
            delete[] dataBlue;
        }
        else if (1 == pImage.channels())
        {
            int height = pImage.rows;
            int width = pImage.cols;
            uchar *dataGray = new uchar[width * height];
            memcpy(dataGray, pImage.data, width * height);
            GenImage1(&Hobj, "byte", width, height, (Hlong)(dataGray));
            delete[] dataGray;
        }
    
        return Hobj;
    }
    
    int main()
    {
        /*Hobj-->Mat*/
        HImage img;
        ReadImage(&img, "D:\\WorkSpace\\123.png");
        Mat cvImg;
        double t = (double)getTickCount();
        cvImg = HObject2Mat(img);
        t = (double)getTickCount() - t;
        t = t*1000. / cv::getTickFrequency();
        cout << t << endl;
        imshow("cvWindow", cvImg);
        //system("pause");
        waitKey();
        /**/
    
    
        /*Mat-->hobj*
        Mat cvImg=imread("D:\\WorkSpace\\123.png",0);
        
        HImage img;
        double t = (double)getTickCount();
        img = Mat2HObject(cvImg);
    //  img = IplImageToHImage(cvImg);
        t = (double)getTickCount() - t;
        t = t*1000. / cv::getTickFrequency();
        cout << t << endl;
        Hlong width, height;
        img.GetImageSize(&width, &height);
        HWindow w(0, 0, 0.5*width, 0.5*height);
        img.DispImage(w);
        w.Click();
        w.ClearWindow();
        /**/
        return 0;
        
    }
    

    相关文章

      网友评论

          本文标题:opencv和halcon图像数据类型相互转换

          本文链接:https://www.haomeiwen.com/subject/hqhbxktx.html