Halcon图像格式和opencv格式转换

IplImage* ImageProcess::HImageToIplImage(Hobject &Hobj)
{
 
    IplImage*   pImage;
    HTuple     htChannels;
    char cType[MAX_STRING];
    Hlong    width,height;
    width=height=0;
    //转换图像格式
    convert_image_type(Hobj,&Hobj,"byte");
    count_channels(Hobj,&htChannels);
    if(htChannels[0].I()==1)
    {
        unsigned char* ptr;
        get_image_pointer1(Hobj,(Hlong*)&ptr,cType,&width,&height);
        pImage=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
        for(int i=0;i<height;i++)
        {
            memcpy(pImage->imageData+pImage->widthStep*i,ptr+width*i,width);
        }
    }
    if(htChannels[0].I()==3)
    {
        unsigned char *ptrRed , *ptrGreen , *ptrBlue;
        ptrRed=ptrGreen=ptrBlue=NULL;
        get_image_pointer3(Hobj,(Hlong*)&ptrRed,(Hlong*)&ptrGreen,(Hlong*)&ptrBlue,cType,&width,&height);
        IplImage *pImageRed , *pImageGreen , *pImageBlue ;
        pImage=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);
        pImageRed=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
        pImageGreen=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
        pImageBlue=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
        for(int i=0;i<height;i++)
        {
            memcpy(pImageRed->imageData+pImageRed->widthStep*i , ptrRed+width*i , width);
            memcpy(pImageGreen->imageData+pImageGreen->widthStep*i , ptrGreen+width*i , width);
            memcpy(pImageBlue->imageData+pImageBlue->widthStep*i , ptrBlue+width*i , width);
        }
        cvMerge(pImageBlue,pImageGreen,pImageRed,NULL,pImage);
        cvReleaseImage(&pImageRed);
        cvReleaseImage(&pImageGreen);
        cvReleaseImage(&pImageBlue);
    }
    return pImage;
}
 
Hobject ImageProcess::IplImageToHImage(IplImage*  pImage)
{
    Hobject   Hobj;
    if(pImage->nChannels==1)
    {
        int height=pImage->height;
        int width=pImage->width;
        uchar *dataGray=new uchar[width*height];
        for(int i=0; i<height; i++)
        {
            memcpy(dataGray+width*i, pImage->imageData+pImage->widthStep*i,width);
        }
        gen_image1(&Hobj,"byte",pImage->width,pImage->height,(Hlong)(dataGray));
        delete[ ] dataGray;
    }
    if(pImage->nChannels==3)
    {
        IplImage  *pImageRed, *pImageGreen, *pImageBlue;
        pImageRed=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
        pImageGreen=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
        pImageBlue=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
        cvSplit(pImage, pImageBlue, pImageGreen, pImageRed,NULL);
        uchar*  dataRed=new uchar[pImage->width*pImage->height];
        uchar*  dataGreen=new uchar[pImage->width*pImage->height];
        uchar*  dataBlue=new uchar[pImage->width*pImage->height];
        int  height=pImage->height;
        int  width=pImage->width;
        for(int i=0; i<height; i++)
        {
            memcpy(dataRed+width*i, pImageRed->imageData+pImageRed->widthStep*i,width);
            memcpy(dataGreen+width*i, pImageGreen->imageData+pImageGreen->widthStep*i,width);
            memcpy(dataBlue+width*i, pImageBlue->imageData+pImageBlue->widthStep*i,width);
        }
        gen_image3(&Hobj,"byte",pImage->width,pImage->height,(Hlong)(dataRed),(Hlong)(dataGreen),(Hlong)(dataBlue));
        cvReleaseImage(&pImageRed);
        cvReleaseImage(&pImageGreen);
        cvReleaseImage(&pImageBlue);
        delete[ ]  dataRed;
        delete[ ]  dataGreen;
        delete[ ]  dataBlue;
    }
    return Hobj;
 
}

猜你喜欢

转载自blog.csdn.net/qq_36576377/article/details/79850282