皮皮网

【钓鱼人网站源码】【vmp授权源码】【通天西游源码】halcon算子源码_halcon算子源码如何查看

来源:java 博客系统源码 时间:2024-12-23 20:19:00

1.[Halcon算子]Halcon算子之XLD(一)
2.halcon对三角形进行开运算的算源n算算子是什么,对规则形状进行识别,源码圆用圆形度,何查三角形应该用什么特征值?
3.动手实现halcon的算源n算wiener_filter维纳滤波算法以及用于图像去除失焦模糊
4.Halcon拼图算子详解之proj_match_points_ransac
5.动手实现halcon的local_threshold局部阈值分割算法
6.Halcon拼图算子详解之tile_images_offset函数

halcon算子源码_halcon算子源码如何查看

[Halcon算子]Halcon算子之XLD(一)

        在Halcon中,图像是由像素组成的,一般的算法也都是基于像素来进行处理,所以其中Image和Region都是以像素为最小单位,XLD用来表示亚像素的轮廓或者多边形。

        XLD的特征大部分跟Region很像,很多算子都是在Region的算子后加上_xld。其主要的特征如下:

        1.get_contour_xld(Contour : : : Row, Col)

功能:返回XLD轮廓的坐标;

输入:XLD对象Contours;

输出: 坐标值Row和Col;

2.get_lines_xld(Polygon : : : BeginRow, BeginCol, EndRow, EndCol, Length, Phi)

功能:返回一个XLD多边形的数据(以线形式);

输入:多边形XLD对象Polygon ;

输出: 直线的起点坐标、终点坐标、长度和角度;

3.get_parallels_xld(Parallels : : : Row1, Col1, Length1, Phi1, Row2, Col2, Length2, Phi2)

功能:返回一个XLD平行数据(以线形式);

输入:两平行线XLD对象Parallels ;

输出:Row1, Col1, Length1, Phi1, 两平行线第一条两端点坐标与线长,线方向;

输出: Row2, Col2, Length2, Phi2两平行线第二条两端点坐标与线长,线方向;

4.get_polygon_xld(Polygon : : : Row, Col, Length, Phi)

功能:返回一个XLD多边形的数据;

输入:多边形XLD对象Polygon ;

输出: 多边形每个顶点坐标Row,Col、每条边的长度和角度;

        1.gen_circle_contour_xld( : ContCircle : Row, Column, Radius, StartPhi, EndPhi, PointOrder, Resolution : )

功能:根据相应的圆或者圆弧创建XLD;

输入:圆弧的圆心坐标,半径,起始角度和终止角度 ;

输入:沿着圆弧点的方向(PointOrder),可选“positive”和“negative”;

输出: 创建的XLD对象ContCircle;

2.gen_contour_nurbs_xld( : Contour : Rows, Cols, Knots, Weights, Degree, MaxError, MaxDistance : )

功能:将NURBS曲线转换为XLD轮廓;

输入:NURBS曲线的参数 ;

输出: 近似NURBS曲线的XLD轮廓;

3.gen_contour_polygon_rounded_xld( : Contour : Row, Col, Radius, SamplingInterval : )

功能:根据一个带圆角的多边形(以元组形式给出)创建一个XLD轮廓;

输入:多边形参数 ;

输出: 多边形生成的XLD轮廓;

4.gen_contour_polygon_xld( : Contour : Row, Col : )

功能:根据一个多边形(以元组形式给出)创建一个XLD轮廓;

输入:多边形点坐标Row,Col ;

输出: 多边形生成的XLD轮廓;

5.gen_contour_region_xld(Regions : Contours : Mode : )

功能:根据区域Region创建XLD轮廓;

输入:区域Region ;

输入:模式Mode,“Center”,以边界像素的中心作为轮廓点;“border”,以边界像素的外边界作为轮廓点;“border_holes”,获取外边界同时可以获得所有孔的轮廓 ;

输出: 生成的XLD轮廓;

6.gen_contours_skeleton_xld(Skeleton : Contours : Length, Mode : )

功能:将骨架转换为XLD轮廓(contour);

输入:轮廓骨架Skeleton ;

输入:提取轮廓线包含的最小点数;

输入:输入过滤模式( 'filter', 'generalize1', 'generalize2');

        'filter' ,因为轮廓线在端点被分割,所以会存在一种情况,就是即使很长的轮廓线也可能被分割成很多的短线,即使他们的长度大于设定参数Length;

        'generalize1',这种模式下,就可以避免长的轮廓被分割,而且长度小于参数Length的线段会被舍弃;

        'generalize2' ,那么短的线段会被保留下来,只要线段有两个端点,即使长度小于参数Length,也会被保留。

输出: 生成的XLD轮廓;

7.gen_cross_contour_xld( : Cross : Row, Col, Size, Angle : )

功能:根据每个输入点交叉的形状创键一个XLD轮廓(contour);

输入:所有交叉点的坐标Row、Col ;

输入:交叉点的大小;

输入:每个交叉点的角度Angle;

输出: 生成的XLD轮廓Cross ;

8.gen_ellipse_contour_xld( : ContEllipse : Row, Column, Phi, Radius1, Radius2, StartPhi, EndPhi, PointOrder, Resolution : )

功能:根据相应的椭圆弧创建一个XLD轮廓(contour);

输入:椭圆弧的参数Row、Col、Phi ;

输入:轮廓点的顺序,“positive”和“negative”;

输入:相邻轮廓点的最大距离Resolution;

输出: 生成的XLD轮廓ContEllipse ;

9.gen_nurbs_interp( : : Rows, Cols, Tangents, Degree : CtrlRows, CtrlCols, Knots)

功能:根据给定的插值点,创建NURBS曲线的控制数据;

输入:所有交叉点的坐标Row、Col ;

输入:交叉点的大小;

输入:每个交叉点的角度Angle;

输出: 生成的XLD轮廓ContEllipse ;

.gen_parallels_xld(Polygons : Parallels : Len, Dist, Alpha, Merge : )

功能:提取平行的XLD多边形(polygon);

输入:待提取的多边形轮廓 Polygons ;

输入:提取长度超过Len的线段,投影距离小于Dist;

输入:多边形最大角度差Alpha和是否合并相邻的平行关系Merge;

输出: 提取的平行XLD轮廓Parallels ;

.gen_polygons_xld(Contours : Polygons : Type, Alpha : )

功能:根据多边形近似创建XLD轮廓(contour);

输入:想要逼近的XLD轮廓Contours ;

输入:逼近的类型Type,主要为“ramer”算法;

输入:逼近的阈值是通过Alpha 设置的;

输出: 近似后的轮廓Polygons ;

.gen_rectangle2_contour_xld( : Rectangle : Row, Column, Phi, Length1, Length2 : )

功能:创建一个Rect2矩形XLD轮廓(contour);

输入:Rect2的参数;

输出: 生成的XLD轮廓Rectangle ;

.mod_parallels_xld(Parallels, Image : ModParallels, ExtParallels : Quality, MinGray, MaxGray, MaxStandard : )

功能:提取封闭区域内的平行XLD多边形(polygon);

输入:输入的XLD轮廓Parallels;

输入:最小品质因数(并行度的度量)Quality;

输入:设定最小灰度,最大灰度和最大标准偏差MaxStandard ;

输出: 返回的平行的XLD轮廓ModParallels;

输出: 扩展的XLD轮廓ExtParallels ;

        1.affine_trans_contour_xld(Contours : ContoursAffineTrans : HomMat2D : )

功能:对XLD轮廓(contour)进行任意二维仿射变换;

输入:圆弧的圆心坐标,半径,起始角度和终止角度 ;

输入:沿着圆弧点的方向(PointOrder),可选“positive”和“negative”;

输出: 创建的XLD对象ContCircle;

2.gen_contour_nurbs_xld( : Contour : Rows, Cols, Knots, Weights, Degree, MaxError, MaxDistance : )

功能:将NURBS曲线转换为XLD轮廓;

输入:NURBS曲线的参数 ;

输出: 近似NURBS曲线的XLD轮廓;

3.gen_contour_polygon_rounded_xld( : Contour : Row, Col, Radius, SamplingInterval : )

功能:根据一个带圆角的多边形(以元组形式给出)创建一个XLD轮廓;

输入:多边形参数 ;

输出: 多边形生成的XLD轮廓;

4.gen_contour_polygon_xld( : Contour : Row, Col : )

功能:根据一个多边形(以元组形式给出)创建一个XLD轮廓;

输入:多边形点坐标Row,Col ;

输出: 多边形生成的XLD轮廓;

5.gen_contour_region_xld(Regions : Contours : Mode : )

功能:根据区域Region创建XLD轮廓;

输入:区域Region ;

输入:模式Mode,“Center”,以边界像素的中心作为轮廓点;“border”,以边界像素的外边界作为轮廓点;“border_holes”,获取外边界同时可以获得所有孔的轮廓 ;

输出: 生成的XLD轮廓;

6.gen_contours_skeleton_xld(Skeleton : Contours : Length, Mode : )

功能:将骨架转换为XLD轮廓(contour);

输入:轮廓骨架Skeleton ;

输入:提取轮廓线包含的最小点数;

输入:输入过滤模式( 'filter', 'generalize1', 'generalize2');

        'filter' ,因为轮廓线在端点被分割,所以会存在一种情况,就是即使很长的轮廓线也可能被分割成很多的短线,即使他们的长度大于设定参数Length;

        'generalize1',这种模式下,就可以避免长的轮廓被分割,而且长度小于参数Length的线段会被舍弃;

        'generalize2' ,那么短的线段会被保留下来,只要线段有两个端点,即使长度小于参数Length,也会被保留。

输出: 生成的XLD轮廓;

halcon对三角形进行开运算的算子是什么,对规则形状进行识别,源码圆用圆形度,何查钓鱼人网站源码三角形应该用什么特征值?

       Halcon对三角形进行开运算的算源n算算子是"opening_shape"。它可以对二值图像中的源码三角形进行开运算操作,即先进行腐蚀操作,何查再进行膨胀操作,算源n算用于去除小的源码噪点和连接不完整的三角形。

       对于规则形状的何查识别,可以使用不同的算源n算特征值来描述不同的形状。对于圆形,源码可以使用圆形度(circularity)作为特征值,何查圆形度定义为轮廓面积除以其最小外接圆面积。而对于三角形,可以使用诸如边长、内角、周长、面积等特征值来描述。vmp授权源码Halcon中可以使用函数"shape_features"来计算形状的特征值,该函数可以计算诸如面积、周长、中心、方向、最小外接矩形等多种特征值。

动手实现halcon的wiener_filter维纳滤波算法以及用于图像去除失焦模糊

       维纳滤波算法wiener_filter能够帮助我们从含有噪声和模糊的图像中恢复出原始图像。图像的形成被建模为原始图像与脉冲响应的卷积加上噪声。

       具体来说,图像可以被描述为原始图像与模糊脉冲响应的卷积再加入噪声的结果。为了模拟这种失焦模糊,我们使用gen_psf_defocus算子来生成脉冲响应。设置模糊半径为5,生成的脉冲响应图如下所示。接着,我们通过频率平面对脉冲响应进行移位,将直流分量移至中心位置。

       模拟失焦效果时,使用simulate_defocus算子,输入模糊半径参数,通天西游源码算法通过图像与脉冲响应进行卷积操作(等价于在频率域进行乘积)来生成失焦图像。例如,模糊半径设置为5,模拟的失焦图像如下。

       在Halcon中,wiener_filter算子用于实现维纳滤波算法。其接口定义为wiener_filter(Image, Psf, FilteredImage : RestoredImage : : ),其中Psf表示脉冲响应,FilteredImage用于估计噪声频谱,而RestoredImage为最终恢复的图像。

       在实现此算法时,根据估计的信噪比nsr来估算噪声频谱。对于某幅模糊图像,通过应用该算法,我们可以得到如下的恢复效果。下面,我们对比了自研算法与Halcon算法的执行速度,在个人台式电脑上,自研算法耗时约ms,而Halcon则耗时约ms。网课 源码在笔记本电脑上,自研算法的执行速度接近Halcon的4倍。

       总的来说,维纳滤波算法能有效从失焦图像中恢复出原始图像,且自研算法的执行速度表现相当出色。相较于Halcon的实现,自研算法在速度上有显著优势。

Halcon拼图算子详解之proj_match_points_ransac

       proj_match_points_ransac函数用于计算两个图像间的投影变换矩阵,通过寻找点对应关系实现。此函数拥有多个参数,以优化计算过程。

       函数原型如下:proj_match_points_ransac(Image1, Image2, Rows1, Cols1, Rows2, Cols2, GrayMatchMethod, MaskSize, RowMove, ColMove, RowTolerance, ColTolerance, Rotation, MatchThreshold, EstimationMethod, DistanceThreshold, RandSeed: HomMat2D, Points1, Points2)

       其中,Image1与Image2代表输入图像,Rows1与Cols1代表Image1中特征点坐标,Rows2与Cols2代表Image2中特征点坐标。

       GrayMatchMethod参数决定灰度值比较度量,如ncc、sad或ssd,MaskSize则为灰度值遮罩大小,通常在至之间。phaser源码研究RowMove与ColMove设置平均坐标移位。

       RowTolerance与ColTolerance定义匹配搜索窗口半高与半宽,Rotation参数则控制旋转角度范围。MatchThreshold控制灰度值匹配阈值,值范围通常在至之间,或者为0.9至0.7的浮点数。EstimationMethod决定变换矩阵估计算法。

       DistanceThreshold用于转换一致性检查,RandSeed用于随机数生成器种子。默认值分别为0.2与0,分别对应输出HomMat2D齐次射影变换矩阵、Points1与Points2图1与图2中匹配输入点的指数。

动手实现halcon的local_threshold局部阈值分割算法

       halcon局部阈值分割算法实现详解

       算法概述

       接口解析

       local_threshold()函数

       halcon中的local_threshold()算子,用于基于局部阈值分割图像。接口定义如下:

       local_threshold(Image : Region : Method, LightDark, GenParamName, GenParamValue : )

       方法选择

       当前只支持adapted_std_deviation方法,通过局部mask_size*mask_size窗口内的灰度标准差动态计算阈值。

       原理与公式

       公式如下,描述mask_size*mask_size窗口内灰度均值与标准差的关系,用于确定阈值:

       其中[公式]表示mask_size*mask_size窗口内的灰度均值, [公式]为窗口内灰度标准差,k为缩放系数,R为假设的最大标准差值,对于byte类型图像,R通常设为。

       应用场景

       局部阈值分割依据局部灰度统计信息,适用于背景灰度不均匀的图像分割,如图所示背景亮度不均匀的图像,全局阈值分割效果不佳。

       算法优化

       传统遍历方法效率低下,可考虑使用积分图优化标准差计算。根据方差公式,计算灰度值积分图和灰度值平方积分图,实现快速分割。

       代码示例

       利用opencv的重载积分图算子计算灰度值积分图和平方积分图,一次调用即可完成。

       实例与性能对比

       使用lightDark=dark,maskSize=,scale=0.2,range=的参数,分割效果如图所示,字符区域被有效分割。

       执行速度测试显示,halcon平均耗时.8ms,自研算法耗时.1ms,两者速度基本一致。使用积分图算法时间与maskSize无关,效率优于传统遍历方法。

Halcon拼图算子详解之tile_images_offset函数

       在Halcon图像处理库中,tile_images_offset函数被设计用于根据明确的位置信息将多张图像拼接成一张大图像。这个功能在需要创建复合图像或实现图像拼接任务时非常实用。

       具体使用时,可以通过以下原型进行调用:tile_images_offset( Images: TiledImage: OffsetRow, OffsetCol, Row1, Col1, Row2, Col2, Width, Height: )。

       函数中各参数具有明确的用途和作用,具体如下:

       Images (input_object):这是输入图像的集合,可以是单张或多张图像。这些图像将在拼接过程中根据指定的位置和尺寸被放置。

       TiledImage (output_object):这是函数处理后输出的拼接图像。该图像将整合输入图像集合,按照设定的位置和尺寸拼接而成。

       OffsetRow (input_control) 和 OffsetCol (input_control):这两个参数用于指定拼接后图像中输入图像左上角的行坐标和列坐标。通过调整这两个值,可以精确控制输入图像在最终大图像中的放置位置。

       Row1 (input_control) 和 Col1 (input_control):这两个参数定义了裁切图像的左上角行坐标和列坐标。在拼接过程中,这些坐标用于确定输入图像在大图像中被裁切或放置的区域的起始位置。

       Row2 (input_control) 和 Col2 (input_control):这两个参数用于确定裁切图像的右下角行坐标和列坐标。它们与Row1和Col1参数一起,共同定义了输入图像在拼接后的大小和形状。

       Width (input_control) 和 Height (input_control):这两个参数分别指定拼接后图像的宽度和高度。它们决定了最终复合图像的尺寸。

       通过合理设置这些参数,用户可以灵活地控制和调整图像拼接的过程,实现多样化的图像组合和布局,满足不同场景和应用需求。在Halcon中,tile_images_offset函数为图像处理和应用开发提供了强大的工具,极大地提升了图像处理的灵活性和效率。

如何把OpenCV、Halcon算子嵌入到海康的VM算法平台

       VM算法平台允许用户自定义开发算子模块,以实现特定功能或扩展现有算子功能。对于熟悉OpenCV或Halcon的用户,集成这些软件的算子至VM算子模块是可能的。接下来,我们将通过具体步骤,以Canny边缘检测和Halcon阈值分割算子为例,展示如何将OpenCV和Halcon算子嵌入到VM算法平台中。

       ### 集成OpenCV算子

       以Canny边缘检测算子为例,集成流程包括:

       使用AlgorithmXMLGenerator生成算子模块的三层架构文件,并根据开发文档编译控件层和算法层工程,将控件层生成的.dll文件复制到界面层文件夹。

       在Visual Studio中配置OpenCV的开发环境。

       将HKA_IMAGE类型转换为OpenCV Mat类型,这涉及到对HKA_IMAGE结构体的分析,包括图像格式、宽度、高度、行间距和数据存储地址。

       调用OpenCV的算子API处理图像,包括图像读取、边缘检测和图像显示。

       将OpenCV Mat类型的输出图像转换回HKA_IMAGE类型。

       将自定义开发的算子模块整合至VM算法平台后,OpenCV Canny边缘检测功能得以实现。

       ### 集成Halcon算子

       以Halcon阈值分割算子为例,集成步骤包括:

       同样使用AlgorithmXMLGenerator生成算子模块的三层架构文件,并编译控件层和算法层工程。

       在Visual Studio中配置Halcon的开发环境。

       将HKA_IMAGE类型转换为Halcon HObject类型,涉及到对图像数据的处理和内存分配。

       调用Halcon的算子API处理图像,包括图像转换、阈值分割和区域连接。

       将Halcon HObject类型的输出图像转换回HKA_IMAGE类型。

       完成这些步骤后,Halcon阈值分割功能在VM算法平台中得到实现。

       ### 总结

       通过上述示例,我们展示了如何将OpenCV和Halcon算子嵌入到VM算法平台中,以实现特定的图像处理功能。这标志着VM算法平台已正式整合主流的第三方视觉工具,为用户提供更多样化的视觉解决方案。