LabVIEW联合Halcon编程学习笔记(1)

虽然NI有自己的图像处理软件,但感觉不是很好用,而Halcon在图像处理上很明显有优势,试着学习将二者结合起来进行图像处理。

要将二者结合起来进行图像处理,第一步必须要把LV image转换成Halcon image,然后调用halcon算子进行处理。而如何将LV image转换成halcon image早已经有人做过了,可以直接在LV论坛上搜索相关关键词进行详细了解,我只是跟着大神的步伐跟着做一遍。网址:LabVIEW and Halcon - NI CommuLVty

此笔记只是将8位图像转换成halcon图像,彩色或多通道的图像转换暂时还不能做到,希望知道如何转换的大佬可以分享下。二者的图像转换要用到LabVIEW的库函数和halcon中的GenImage1、getimagepointer1算子,将LV Image的存放的内存区域指针传递给Halcon,然后Halcon直接在数据区域进行处理。

整个程序的前面板和程序框图如下图:

首先读取一张图片,然后将图片处理成数组数据存放在内存中,这里需要用到IMAQ ImageToArray这个函数,在此函数前面因为提取了颜色平面,所以转换成的图片数组数据则是U8类型。

将图像转换成数组数据之后,就需要将这组数据存储在内存中,在存储之前需要先开辟专门一片内存区域,清空此区域的数据并获得此片区域的指针,而DSNewPClr这个库函数就是用来清空这片区域的。

在调用库函数中,直接在库名/路径中输入LabVIEW(这是直接调用LabVIEW自带的库函数),然后在函数名中选中DSNewPClr函数,然后再进入参数界面进行设置。此库函数需要返回这片内存区域的指针,所以第一个参数直接设置成pointer数值,选择无符号整型。接着指定输入的内存区域大小Size,因为内存大小也是一个具体的数值,且是有符号的整数,所以选择有符号32位整型数据类型。存放图像的内存数据Size的大小是图像的 长x宽再乘上通道数,因为前面已经将图像转换成灰度图,所以直接乘上1就得到内存区域的Size。

MoveBlock库函数是将图像数据写入到刚才开辟出来的内存数据区域内,此函数的位置还是同DSNewPClr函数一致。其中参数的设置根据函数原型进行相应的设置即可。Source参数是uint8_t,所以输入的数据只能是U8类型的数组,这也是为什么此例只能解决U8类型图像转换的原因。

将图像数据处理成数组,且存放进内存区域后,就需要将该数据提供给halcon使用,这里就需要使用halcon的一个函数GenImage1,其中pixelPointer是labview中的引用类型,而库函数中的指针类型是数值,二者要联系起来就需要使用Microsoft中的.net程序集函数,在后面板中导入.net构造器,按照mscorlib -> System -> IntPtr -> IntPtr(Int32 value)顺序,生成整型指针引用的函数。将库函数的指针数值连接value输入端,这样就生成内存区域的指针引用。因为我安装的labview是32位的,所以选择Int32 value,防止数据出错。

接着还是通过.net构造器将halcon的算子程序集导入进来,按照下图设置,就可以将HImage构造器创建好,再通过此构造器再去做halcon的图像处理操作。

再选择调用方法函数,跟HImage函数连接,选择GenImage1函数,生成此函数,type处输入byte字符串(byte是根据halcon中GenImage1函数参数设置要求而来)。长宽和指针输入端依次连接好,需注意LV image和Halcon image行列是相反的,所以二者要交叉相连。

转换的图像要以halcon的方式显示出来,需要在前面板上插入.NET容器,调用halcondotnet.dll文件,此文件一般在安装目录下,Program Files\MVTec\HALCON-17.12-Progress\bin\dotnet20,试着安装你安装halcon的盘中以此路径找到这个dll文件。然后插入HWindowControl,前面板就会出现图像显示窗口。

通过属性节点设置,将此窗口的属性进行设置,SetPart函数是将原图像进行缩放,然后在窗口中将图片全部显示的一个操作。因为图像的分辨率一般会很大,若没有设置窗口的大小,则到时只能显示图像的某部分。输入两个点,一般输入原点和图像的行列最大值,就会将图像的所有信息显示。

然后就是把图像真正的显示出来了,通过调用Hwindow的DispImage算子,将存放图像数据的内存指针接入image输入端。加循环是因程序每次运行完之后窗口会自动清理图像,加上循环之后可一直显示图像。

调用的所有方法和引用最后都要关掉释放归还出内存,不然可能会造成内存溢出。尤其是图像分辨率较大时,若不释放内存,则占用的内存会越来越大,最后导致内存溢出。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值