Halcon图像与Opencv图像相互转换(C++代码)

本文介绍如何实现Halcon中的Hobject类型图像与OpenCV中的IplImage类型图像之间的转换,并提供了一个画图函数用于展示转换后的图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在将halcon程序转换到C++代码后有时我们会经常涉及到Halcon里面的Hobject类型的ImageOpencv里面的IplImage类型的Image之间的相互转换。相互转换分装成了两个函数,具体实现如下:

1)、从HobjectIplImage

IplImage* 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(htChannel[0].I()==1)

{

unsinged 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)

{

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

}

 

2)、从IplImageHobject

Hobject 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  *IpImageRed, *IplImageGreen,*IplImageBlue;

IplImageRed=cvCreateImage(cvSize(pImage),IPL_DEPTH_8U,1);

IplImageGreen=cvCreateImage(cvSize(pImage),IPL_DEPTH_8U,1);

IplImageBlue=cvCreateImage(cvSize(pImage),IPL_DEPTH_8U,1);

cvSplit(pImage, pImageBlue, pImageGreen,pImageRed,NULL);

uchar*  dataRed=newuchar[pImage->width*pImage->height];

uchar*  dataGreen=newuchar[pImage->width*pImage->height];

uchar*  dataBlue=newuchar[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;

}

 

3)、封装一个画图函数

void   DrawPicToHDC(IplImage* img ,UINT ID)

{

CDC* pdc=GetDlgItem(ID)->GetDC();

HDC hdc=pdc->GetSafeHdc();

CRect rect;

GetDlgItem(ID)->GetClientRect(&rect);

CvvImage vvimg;

vvimg.CopyOf(img);

vvimg.DrawToHDC(hdc , &rect);

ReleaseDC(pdc);

}

 

4)、测试

新建一个MFC对话框项目,添加一个pic控件,IDIDC_IMG,添加一个图片显示按钮ShowImg,双击按钮添加消息处理函数,如下

建立一个全局变量

IplImage* opencv_image;

void  OnBnClickedShowimg()

{

Hobject Image;

read_image(&Image,"E:/.../1.jpg");

opencv_image=HImageToIplImage(Image);

DrawPicToHDC(opencv_image,IDC_IMG);

cvReleaseImage(&opencv_image);

}

如果没有语法输入错误,应该就没问题了,可以将Halcon的图片转换为Opencv的图片,然后画到pic控件上。需要的环境就是要附加上opencv库和halcon库,还要加上CvvImage.hCvvImage.cpp两个文件。这样就OK啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值