如何用C++调用halcon函数?

如何用C++调用halcon函数?,第1张

下面是一个用C++调用halcon函数的实例,说明://后面的部分为程序的说明,在程序运行中是不起作用的。

a)  gen_image1_extern函数中的变量width,height必须为HTuple类型,Pointer指针为unsignedchar类型,输入时转换为long型。

b)  width,height必须与Pointer指向的图像数链基据的长宽一致。

c)  Pointer指针在gen_image1_extern函数调用之前分配了内存,之后不要马上释裂唤闭放,否则会出错。应该在确保不再使用Image变量之后再释放。halcon内部会自动释放Image,感觉没有释放Pointer(还需要进一步验证)。

d)  显示图像时,可能存在着图像的上下翻转,可以按照1中的方法,将图像数据翻转后再调用gen_image1_extern,或者使用肆裂halcon中的函数mirror_image()进行翻转。

BITMAPINFO*RotateBmpInfo

BYTE*bitBuffer

bitBuffer=NULL

bitBuffer=newBYTE[sizeof(BITMAPINFO)]

RotateBmpInfo=(BITMAPINFO*)bitBuffer

RotateBmpInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER)

RotateBmpInfo->bmiHeader.biHeight     =Height

RotateBmpInfo->bmiHeader.biWidth     =Width

RotateBmpInfo->bmiHeader.biPlanes     =1

RotateBmpInfo->bmiHeader.biBitCount=24

RotateBmpInfo->bmiHeader.biCompression  =BI_RGB

RotateBmpInfo->bmiHeader.biSizeImage      =Height*bytewidth

RotateBmpInfo->bmiHeader.biXPelsPerMeter=0

RotateBmpInfo->bmiHeader.biYPelsPerMeter=0

RotateBmpInfo->bmiHeader.biClrUsed         =0

RotateBmpInfo->bmiHeader.biClrImportant  =0

CWnd*m_pWnd

m_pWnd=AfxGetApp()->GetMainWnd()

CDC*pDC=m_pWnd->GetDC()

::StretchDIBits(

pDC->GetSafeHdc(),

Width+10,

Height+10,

从VC++到Halcon

unsignedchar*Pointer

intwidth,height

Pointer=newunsignedchar[width*height]

inti,j

for(i=0i<heighti++)

{

for(j=0j<widthj++)

{

Pointer[i*width+j]=j%255

}

}

HobjectImage

gen_image1_extern(&Image,"byte",(HTuple)width,(HTuple)height,(long)Pointer,NULL)

在VC环境下进行图像处理比在MATLAB下开发运算速度要快,但工作量要大的多,用MATLAB做图像处理,直接调用里面的相关函数就可以完成,而且比较直观,但满足不了在速度上要求比较高的场合。所以在VC环境下直接开发往往是首选,但由于VC只是一个开发环境,直接运用于图像处理的函数还得自己编写添加,所以往往很耗时。随着各类机器视觉软件的开发,各种机器视觉软件包也相继产生,HALCON就是一个比较强大的机器视觉软件,功能比较全,在HDevelop环境下开发比较容易,执行速度也较快。除此之外,HALCON也可以集成到其他开发环境下,这样可以节约底层开发时间,直接野皮有效地运用它的函数库,可以产生很好的效果。下面就结合自己的经验,简单介绍一下在VC环境下如何使用HALCON库。

在VC环境下进行图像处理,往往需要自己写图像处理的类,现在有一些前人写好的类,比如CDib类、DIBAPI类等等,因此可以直接“拿来主义”。HALCON库就相当于一个封装好的类,通过在VC下进行一些简单的设置,我们就可以使用其里面的函数了。下面是在VC环境下如何设置:

1. 首先在project->settings.....中的Link属性页中添加halconcpp.lib;

2. 其次在project->settings.....中的C/C++属性页中的Preprocessor中添加目录$(HALCONROOT)\include,$(HALCONROOT)\include\cpp;

3. 然后在project->settings.....中的Link属性页中input下来菜单中添加路径$(HALCONROOT)\lib\i586-nt4;

4. 最后当然是不要忘了在程序中添加类的头文件了:#i nclude "HalconCpp.h"

上面的设置好了,一切OK了。下面就可以在程序中调用HDevelop中的函数了,比如图像增强函数emphasize(hImage, &hRotateImage, 7, 7, 2.0)等等。我们知道在HDevelop中通常图像是作为一个tuple变量,因此在VC中有必要进行变量转换,例如:

针对灰度图像可以将图像数转换成一个Hobject变量:

gen_image1(&hImage,"byte",WIDTH, HEIGHT,(long)m_pImageBuffer)

针对彩色图像,可以分别取出R、G、B三个分量:

ExtractRGB24Channels(m_pImageBuffer, m_pRed, m_pGreen,m_pBlue)

然后在转换为Hobject变量:

gen_image3(&hImage, "byte", width, height, (long )m_pRed, (long )m_pGreen, (long )m_pBlue)

接下来就可以调用图像处理函数了,比如

图颂御差像增强:emphasize(hImage, &hRotateImage, 7, 7, 2.0)//参数可以调整

阈拆搭值化:bin_threshold(hImage,&hRotateImage)

rgb1_to_gray(hImage,&hRotateImage)//转化为灰度图

把处理完的变量转换成到一个buffer中,用于图像显示:get_image_pointer1(hRotateImage,(long *)&m_pImageBuffer,Type, &width1, &height1)

但在调用HALCON库函数时也碰到了一些问题,比如在图像旋转中rotate_image(hImage, &hRotateImage, 90, "constant")将处理后的变量转换成

get_image_pointer3(hRotateImage, (long *)&m_pRed, (long *)&m_pGreen, (long *)&m_pBlue, Type, &width1, &height1)

ComposeRGB24(m_pRed, m_pGreen, m_pBlue, m_pImageBuffer)

而执行过程中出现错误,get_image_pointer3这个函数报错,Undefined gray value in get_image_pointer3还需解决!

边摸索边进步,在其他环境中的调用还需要试试,比如嵌入式 *** 作系统等等。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8283791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存