
最近看到一个例子,来自一个论坛,提问者想要计算图中木头的数量,悬赏了分值但是没人回复,我看到的时候这帖子已经过去好几年了。作为一个肤浅的初学者,我觉得这问题很有趣,所以打算从这个例子入手,研究下Halcon中的图像处理。
首先,从二值化开始,这张图在刚开始二值化之后出现一些问题。阈值设的高了,会弱化边角一些木头的局部区域,设的低了,会造成一些粘连。而且图像中还有一些干扰。如何在保留边角局部信息的情况下尽可能的防止粘连,是个问题。
结合这个问题,我的思路是分两步走。先把边角一些小的木头区域提取出来,再专门解决粘连的问题,问题得到了解决。
区分大小的依据主要是面积,在做了一些基本的预处理之后,可以把较小的一部分区域图像,如靠近四个边的部分木头,先分割出来了。这个过程中,需要对木头边缘做一些处理,去掉外圈的树皮,和一些干扰的区域,提取出木头截面的大块部分。
得到下图:
这一步就比较简单了,没有小面积区域的顾虑,可以做下腐蚀,让边缘更加清晰。这样就分割开来了。
把上一部分割出的大小区域分别合并,即得到木头的总数了。
btw:这个例子我也做过分水岭算法的测试,但是效果不尽如人意,主要是分割出来的区域太多了,比如图中那片白色的干扰物、右小方的竹棍等,也分割出来了。而边角一些木头的边缘区域又很难顾及到。也可能是参数设置的不够好,所以这个算法我还在研究。
以上是我自己的一些浅薄的思路,希望随着学习的深入,能发现更好的方式。
1、安装Firepackage驱动,该驱动是halcon的1394驱动,安装完毕后,单机安装程序后的installdriverexe,为1394卡安装驱动
2、在halcon中加入如下代码,是通过修改相机的pan参数来获取左右图像的,理想的方法是通过raw16,format7 mod3的设置来获取,但暂时还没有找到实现方式,只能暂时这样。
open_framegrabber ('1394IIDC', 1, 1, 0, 0, 0, 0, 'progressive', 8, 'rgb', -1, 'false', 'default', '00B09D0100AD58AC', 0, -1, AcqHandle)
set_framegrabber_param (AcqHandle, 'bits_per_channel', 8)
set_framegrabber_param (AcqHandle, 'color_space', 'rgb')
set_framegrabber_param (AcqHandle, 'camera_type', '7:0:1')
set_framegrabber_param (AcqHandle, 'horizontal_resolution', 1024)
set_framegrabber_param (AcqHandle, 'horizontal_offset', 0)
set_framegrabber_param (AcqHandle, 'vertical_offset', 0)
set_framegrabber_param (AcqHandle, 'start_row', 0)
grab_image_start (AcqHandle, -1)
while (true)
set_framegrabber_param (AcqHandle, 'pan', 1)
grab_image_async (Image, AcqHandle, -1)
set_framegrabber_param (AcqHandle, 'pan', 0)
grab_image_async (Image1, AcqHandle, -1)
Do something
endwhile
close_framegrabber (AcqHandle)
首先,简单介绍三个算子;然后,纵向比较三个算子不同点;举例说明算子的用法。
gen_image1( : Image : Type, Width, Height, PixelPointer : )
从像素指针创建图像,即得到像素的内存指针(PixelPointer),已知图像的类型(Type)、尺寸(Width、Height)就可将其转化为HImage。
gen_image3(: ImageRGB : Type, Width, Height, PixelPointerRed, PixelPointerGreen, PixelPointerBlue : )
从像素指针创建图像,即得到像素的RGB三通道内存指针(PixelPointerRed、PixelPointerGreen、PixelPointerBlue),已知图像的类型(Type)、尺寸(Width、Height)就可将其转化为HImage。
gen_image_interleaved( : ImageRGB : PixelPointer, ColorFormat, OriginalWidth, OriginalHeight, Alignment, Type, ImageWidth, ImageHeight, StartRow,StartColumn, BitsPerChannel, BitShift : )
从像素指针创建图像,即得到像素的内存指针(PixelPointer),已知图像的类型(ColorFormat)、尺寸(ImageWidth、ImageHeight)就可将其转化为HImage。
gen_image1适合于单通道图像转化,gen_image3转化需要分别知道RGB三个通道的指针,gen_image_interleaved转化需要知道图像的内存的总指针以及图像的格式。
因此gen_image1适合单通道灰度图转化,gen_image3适合RGB三通道内存分别存放的相机转化,gen_image_interleaved基本适合所有格式的转化, *** 作简单且可以进行ROI *** 作,因为大部分相机采相为1个总指针,所以gen_image_interleaved适用范围非常广,所以我们首先结合Halcon的例子来展示一下这个算子的魅力。
1读取图像
read_image (Image, ‘lena’)
2将图像分离为三通道后合并得到图像总指针(这一步是一个外部函数,大家不必关心,因为相机SDK基本可以直接拿到这个指针)
rgb3_to_interleaved (Image,ImageInterleaved)
get_image_pointer1 (ImageInterleaved,Pointer, TypeRGB, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width / 3, Height,’black’, WindowHandle)
dev_set_part (0, 0, Height, Width / 3)
Visionpro的优势
1、在美国有着更大的市场
2、对于无编程基础的人员来说更加简单易用
3、更低的系统软件开发lisence花费
4、具有美国邮政的条码读取工具
5、QuickBuild环境允许无编程基础的人更快的开发应用程序
15 Visionpro的劣势
1、有限的3D机器视觉算法库
2、更低的运行时lisence花费
3、支持的图像位深度少
4、没有GPU处理
5、很少的图像处理算法工具(例如缺少FFT)
6、QuickBuild环境下,想要开发出更高级的应用程序会增加不必要的复杂性,与其这样,您最好在NET的环境中去开发您的程序,这样就避免QuickBuild环境带来的不便
二、视觉处理性能
21 2D模式匹配
对于8位灰度图像而言,Visionpro的PatMax和Halcon的几何模式匹配算法具有几乎一样的2D模式匹配性能。Halcon的模式匹配也可以用在16位的图像上。Visionpro模式匹配只能用于8位图像。
22 1D和2D形态学
Halcon最高支持32位深度的处理;Visionpro支持基本的8位处理,仅有一小部分工具支持16位的图像。
23 BLOB分析
Halcon的blob工具更多、更灵活、更强大;Visionpro的工具相当的基本,非常适用于典型的应用
24 Imageprocessing filters
halcon拥有不少于100个图像处理滤波器包括FFT,并且支持更高的图像位深度,大多数Halcon滤波器可以运行在32位深度的图像上。Visionpro只有一小部分图像处理滤波器,大部分只支持8位,一些支持16位。Visionpro缺少FFT算法,而该算法在缺陷检测的应用中可以把固定的纹理特征移除。
25 ImageClassifier Tools
Halcon支持相当多的识别以及检测应用的预定义的分类器工具,halcon支持多层感知神经网络分类器,支持向量机分类器,高斯混合模型分类器,N维盒子以及非正态分布数据集领域的聚类。K-最近邻分类器,自动特征选择。
Cognex有一个"Inspection Designer",或者CogDataAnalysis工具,可以允许您根据程序的结果创建一个用户分类器。没有预定义的分类器工具。有一个追加的视觉模块称作VisionPro Surface-其训练算法根据人类视觉提供的线索训练每个种类的缺陷
26 OCRand OCV
OCV比OCR有一个更加易用的接口,使用之前需要训练。Halocn有一个预训练的工业字符库,因此使用时无需训练,库里面的字体的特征已经很完美了。
27 1Dand 2D Barcode tools
1D和2D有同样的性能,Cognex在条码评分等级的数量上有优势并且有解码美国邮政条码的能力
28 图像采集和特征
Visionpro通过他们的图像采集供应商提供对相机的支持。相机供应商或者cognex必须创建一个用户相机配置文件-例如CCF。Visionpro支持通用的Gige视觉系统的GeniCam,但是奇怪的是,不支持其他框架下的通用geniCam比如Cameralink,CoaXpress,或者USB3。
Halcon支持所有的图像采集标准-gige ,usb3,genicam,gentl,directshow,twain等等。Halocn也具有从非高清相机创建高清图像的能力-一般情况下,一个典型的basler gige相机,运用halcon的算法可以获得超过100DB动态范围的高清图像。
简介:opencv开源的计算机视觉库,halcon是商业的视觉库,opencv的一些算子在一般的生产环境下是够用的,但是在对算法速度、精度都要求更高的环境下就有些吃力了。最近在研究halcon,抽几个算子粗略测试一下,效果和速度确实很好,以后可能会在对算法速度要求比较高的地方部署,这里先记录一下opencv和halcon图像数据互转的方法。
参考:
halcon的模板匹配可以归为三类:
1、基于灰度:灰度,互相关ncc
2、基于形状:形状,组件
3、基于描述符:描述匹配
应用场合:定位对象内部的灰度值没有大的变化,没有缺失部分,没有干扰图像和噪声的场合。
1创建模板:create_template()
2寻找模板:best_match()
3释放模板:clear_template()
应用场合:搜索对象有轻微的变形,大量的纹理,图像模糊等场合,速度快,精度低。
1创建模板:create_ncc_model()
2寻找模板:find_ncc_model(),find_ncc_models()
3释放模板:clear_ncc_model()
4get_ncc_model_region (ModelRegion, ModelID)
smallest_rectangle2 (ModelRegion, Row3, Column3, Phi, Length1, Length2)
应用场合:组件匹配是形状匹配的扩展,但不支持大小缩放匹配,一般用于多个对象(工件)定位的场合。
算法步骤:
1获取组件模型里的初始控件 gen_initial_components()
参数:
ModelImage [Input] 初始组件的
InitialComponents [Output] 初始组件的轮廓区域
ContrastLow [Input] 对比度下限
ContrastHigh [Input] 对比度上限
MinSize [Input] 初始组件的最小尺寸
Mode[Input] 自动分段的类型
GenericName [Input] 可选控制参数的名称
GenericValue [Input] 可选控制参数的值
2根据图像模型,初始组件,训练来训练组件和组件相互关系 train_model_components()
3创建组件模型 create_trained_component_model()
4寻找组件模型 find_component_model()
5释放组件模型 clear_component_model()
应用场合:定位对象内部的灰度值可以有变化,但对象轮廓一定要清晰平滑。
1创建形状模型:create_shape_model()
2寻找形状模型:find_shpae_model()
3释放形状模型:clear_shape_model()
应用场合:搜索对象有轻微的变形。
1创建模板:create_local_deformable_model()
2寻找模板:find_local_deformable_model()
3释放模板:clear_deformable_model()
应用场合:搜索对象有轻微的变形,透视的场合,根据一些描述点的位置和灰度值来进行匹配。
1创建模板:create_calib_descriptor_model()
2寻找模板:find_calib_descriptor_model()
3释放模板:clear_descriptor_model()
以上就是关于Halcon粘连图象分割与计数全部的内容,包括:Halcon粘连图象分割与计数、Halcon检测不到Point Grey三目立体视觉相机,哪位大神提供一个解决的思路,深入交流一下。、海康相机sdk转image等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)