关于halcon的一些算子
跟学视频
链接: 联为机器视觉halcon教程视频
比较常用的算子
read_image(Image, ‘fabrik’)
从系统中读取自己需要处理的图像
get_image_size(Image, Width, Height)
获取图片的大小
dev_clear_window()
关窗口
dev_open_window(0, 0, Width, Height, ‘black’, WindowHandle)
开窗口
dev_display(Image)
显示图片
connection(Region, ConnectedRegions)
把上一步区分出来的区域打散,方便下一步进一步确认需要的区域
select_shape(ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 8100, 8500)
根据特定标志选择特定区域,主要看第三个参数,这里是根据面积筛选区域,面积范围看最后两个参数
threshold(Image, Region, 128, 255)
对图像进行分割--最常用的算子
区域-是一个二值化的对象-意为:只有符合跟不符合两种情况
根据最后两个参数范围选取区域
fill_up(SelectedRegions, RegionFillUp)
填充范围的内部(有的范围内部会有未被选择的小空隙,需要这步进行填充)
reduce_domain(Image, RegionFillUp, ImageReduced)
减小特征范围-抠图定位,之后的操作只在这一片区域内有效,不再和其他部分混淆
count_obj(SelectedContours, Number)
计算被选中的区域个数
其他算子
第一节
area_center(SelectedRegions, Area, Row, Column)
确定参数一区域的面积中心
gen_cross_contour_xld(Cross, Row, Column, 60, 0.0)
生成一个+ 在区域中心
参数二:x坐标
参数三:y坐标
参数四:大小
参数五:角度
第五节
get_image_time(Image, MSecond, Second, Minute, Hour, Day, YDay, Month, Year)
获取图片时间
get_image_type(Image, Type)
获取图片类型,主要有位图和矢量图
get_image_pointer1(Image, Pointer, Type1, Width1, Height1)
获取图片位置-pointer-指针,指向图片的内存地址,可以跟C语言结合使用
decompose3(Image11, Image1, Image2, Image3)
把彩图的三个通道(RGB)分解下来
compose3(Image1, Image2, Image3, MultiChannelImage)
再把三通道的三张图(RGB)合成一张彩色图
rgb1_to_gray(MultiChannelImage, GrayImage)
rgb3_to_gray(Image1, Image2, Image3, ImageGray)
把RGB转成灰度图,两种方法
trans_from_rgb(Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, ‘hsv’)
也可以把图片分解为色调,饱和度,亮度三个方面
第六节
threshold_sub_pix(ImageReduced, Border, 158)
亚像素轮廓-xld,比像素更精确,是多个点组成的线,根据第三个参数作为边界值
select_contours_xld(Border, SelectedContours, ‘contour_length’, 90, 120, -0.5, 0.5)
参数详解:Halcon 算子:select_counters_XLD-根据几个特征选择XLD轮廓
根据亚像素的'长度'缩小范围
参数四:长度最小值
参数五:长度最大值
gen_region_contour_xld(SelectedContours, Region1, ‘filled’)
把亚像素的范围填充,亚像素->区域
第八节
区域分割常见的三种方法
①二值化阈值,可以自己固定范围进行分割,不够灵活
Gray :=80
threshold(GrayImage, Region, Gray, 255)
②动态阈值
算子根据自己的算法,进行区域划分
第五个参数的值是算子内部计算出来的,不需要我们给
binary_threshold(GrayImage, Region1, ‘max_separability’, ‘light’, UsedThreshold)
③动态阈值
根据周围的像素点的亮度取平均值,使色度平滑,这里是在13x13方块的范围取平均值(一般都是奇数)
mean_image(GrayImage, ImageMean, 13, 13)
*之前的值比平均值要‘亮’‘10’个度以上才显示,便于画物体轮廓
dyn_threshold(GrayImage, ImageMean, RegionDynThresh, 10, ‘light’)
第九节
union1(ConnectedRegions, RegionUnion)
联合 相当于 反打散 把多个区域又合成一个
draw_region(Region2, WindowHandle)
画区域 按住鼠标右键图像自动闭合退出
boundary(RegionClosing, RegionBorder, ‘inner’)
获取边缘区域
开运算(先腐蚀再膨胀)
以opening开头的算子,例如:
opening_rectangle1(RegionFillUp, RegionOpening, 100, 250)
以100x250的长方形在区域内移动,输出可以容纳该长方形的区域
opening_circle(RegionOpening, RegionOpening1, 3.5)
以3.5为半径的圆在区域内移动,输出可以容纳该圆的区域
闭运算(先膨胀再腐蚀)
以closing开头的算子,例如:
closing_circle(Region3, RegionClosing, 3.5)
先膨胀3.5个像素,再收缩3.5个像素
开运算和闭运算的区别
开运算是"去角"
闭运算是"填坑"
第十节
skeleton(RegionDifference, Skeleton)
骨架,与获取区域边缘差不多
区域之间相交处理
intersection(SelectedRegions, ConnectedRegions1, RegionIntersection)
交集 取两个区域相交的部分
difference(RegionDilation, Region2, RegionDifference1)
取差,取两个区域之间不相交的部分
膨胀和收缩
dilation_circle(Region2, RegionDilation, 3.5)
膨胀 是把参数一这个区域膨胀了3.5个像素形成参数二的区域
erosion_circle(RegionDilation, RegionErosion, 3.5)
收缩 把参数1这个区域收缩了3.5个像素形成参数二的区域
第十二节
作图和生成
draw_circle(WindowHandle, Row, Column, Radius)
gen_circle(Circle, Row11, Column11, 100.5)
画圆
draw_ellipse(WindowHandle, Row, Column, Phi, Radius1, Radius2)
gen_ellipse(Ellipse, Row11, Column11, 0, 100, 60)
画椭圆
参数二:x坐标
参数三:y坐标
参数四:角度
参数五:第一个半径值
参数六:第二个半径值
draw_line(WindowHandle, Row12, Column12, Row22, Column22)
gen_region_line(RegionLines, Row1, Column1, Row2, Column2)
画直线
参数二,参数三:第一个点的坐标
参数四,参数五:第二个点的坐标
draw_point(WindowHandle, Row, Column)
画点
参数二,参数三:点的坐标
draw_rectangle1(WindowHandle, Row12, Column12, Row22, Column22)
gen_rectangle1(Rectangle, Row11, Column11, Row11, Column11)
画长方形,无角度
参数二,参数三:左上角的坐标
参数四,参数五:右下角的坐标
draw_rectangle2(WindowHandle, Row, Column, Phi, Length1, Length2)
gen_rectangle1(Rectangle, Row11, Column11, Row11, Column11)
画长方形,参数四确定角度
draw_region(Region1, WindowHandle)
画区域
第十三节
计算距离
distance_pp(Row11, Column11, Row11, Column11, Distance)
计算两个点的距离
distance_pl(Row11, Column11, Row11, Column11, Row11, Column11, Distance1)
计算点到线的距离
distance_pr(RegionLines, Row11, Column11, DistanceMin1, DistanceMax1)
计算区域最短和最长距离
distance_lr(RegionLines, Row11, Column11, Row11, Column11, DistanceMin2, DistanceMax2)
计算直线到区域最长最短距离
distance_rr_min(RegionLines, RegionLines, MinDistance1, Row12, Column12, Row22, Column22)
计算两个区域最短距离