Halcon学习教程_错误集合

合集下载

HALCON20.11:深度学习笔记(5)

HALCON20.11:深度学习笔记(5)

HALCON20.11:深度学习笔记(5)HALCON 20.11.0.0中,实现了深度学习方法。

关于超参数的有关设置内容如下:不同的DL方法被设计用于不同的任务,它们的构建方式也会有所不同。

它们都有一个共同点,即在模型的训练过程中都面临着一个最小化问题。

训练网络或子网络,一个目标是努力使适当的损失函数最小化,参见“网络和训练过程”一节。

为此,有一组进一步的参数,这些参数是在开始训练之前设置的,在训练期间未进行优化。

我们将这些参数称为超参数。

对于DL模型,您可以设置更改策略,指定您希望在培训期间何时以及如何更改这些超参数。

在本节中,我们将解释不同超参数的概念。

注意,某些方法有额外的超参数,你可以在它们各自的章节中找到更多的信息。

如前所述,损失比较来自网络的预测与图像内容的给定信息。

损失决定惩罚偏差。

训练网络以这样的方式更新滤波器权值,使损失受到的惩罚更少,从而使损失结果得到优化。

为此,需要从训练数据集中获取一定数量的数据。

对于这个子集,计算损失的梯度,并修改网络以更新其相应的滤波权重。

现在,对下一个数据子集重复这一过程,直到整个训练数据被处理。

这些训练数据的子集被称为批,这些子集的大小,即“batch_size”,决定了一个批处理的数据数量,并作为结果一起处理。

对整个训练数据的完整迭代称为epoch。

对训练数据进行多次迭代是有益的。

迭代次数由“epochs”定义。

因此,“epochs”决定了算法在训练集上循环多少次。

一些模型(如异常检测)一次训练使用整个数据集。

对于其他模型,数据集按批处理,为了做到这一点,使用了随机梯度下降算法SGD (Stochastic Gradient Descent)。

这涉及到更多的参数,将在下面解释。

在每次计算损失梯度后,滤波器权值被更新。

对于这个更新,有两个重要的超参数:'learning_rate',它决定更新的损失函数参数(过滤器权重)上的梯度的权重,以及间隔内的'momentum',它指定以前更新的影响。

Halcon学习笔记

Halcon学习笔记

Halcon学习笔记1、Halcon的自我描述Program LogicEach program consists of a sequence of HALCON operatorsThe program can be structured into proceduresThe sequence can be extended by using control operators like if, for, repeat, or whileThe results of the operators are passed via variablesNo implicit data passing is appliedInput parameters of operators can be variables or expressionsOutput parameters are always variablesHDevelop has no features to design a graphical user interfaceAn HDevelop program is considered as a prototypic solution of the vision part of an applicationHDevelop is typically not used for the final application由此可以看出,Halcon的定位是一个类库,有着完整、快速实现函数,同时提供了HDevelop 作为快速开发的图形化(IDE)界面;但是,Halcon程序并不是一个完整的最终应用软件,它没有用户界面,也不提供显示的数据(公用的数据格式)。

Halcon的初学者也应当从参考Halcon的程序入手,熟悉Halcon类库,也即HDevelop-Based Programming;在此基础上,进入ORClass-Oriented Programming。

Halcon学习(20)摄像机标定常用函数(一)

Halcon学习(20)摄像机标定常用函数(一)

Halcon学习(二十)摄像机标定常用函数(一)在HALCON所有算子中,变量皆是如上格式,即:图像输入:图像输出:控制输入:控制输出,其中四个参数任意一个可以为空。

控制输入量可以是变量、常量、表达式,控制输出以及图像输入和输入必须是变量,以存入算子计算结果中。

1.caltab_points:从标定板中读取marks中心坐标,该坐标值是标定板坐标系统里的坐标值,该坐标系统以标定板为参照,向右为X正,下为Y正,垂直标定板向下为Z正。

该算子控制输出为标定板中心3D坐标。

2.create_calib_data:创建Halcon标定数据模型。

输出一个输出数据模型句柄。

3.set_calib_data_cam_param:设定相机标定数据模型中设置相机参数的原始值和类型。

设置索引,类型,以及相机的原始内参数等。

4.set_calib_data_calib_object:在标定模型中设定标定对象。

设定标定对象句柄索引,标定板坐标点储存地址。

5.find_caltab:分割出图像中的标准标定板区域。

输出为标准的标定区域,控制6.find_marks_and_pose:抽取标定点并计算相机的内参数。

输出MARKS坐标数组,以及估算的相机外参数。

即标定板在相机坐标系中的位姿,由3个平移量和3个旋转量构成。

7.set_calib_data_observ_points( : : CalibDataID, CameraIdx, CalibObjIdx,CalibObjPoseIdx, Row, Column, Index, Pose : )收集算子6的标定数据,将标定数据储存在标定数据模型中。

输入控制分别为标定数据模型句柄,相机索引,标定板索引,位姿索引,行列坐标,位姿。

8.calibrate_cameras( : : CalibDataID : Error) 标定一台或多台相机,依据CalibDataID中的数据。

控制输出平均误差。

HALCON20.11:深度学习笔记(9)

HALCON20.11:深度学习笔记(9)

HALCON20.11:深度学习笔记(9)HALCON 20.11.0.0中,实现了深度学习方法。

本章解释了如何使用基于深度学习的异常检测。

通过异常检测,我们想要检测图像是否包含异常。

异常指的是偏离常规的、未知的东西。

异常检测的例子:输入图像的每个像素都被分配了一个值,该值表明该像素是异常的可能性有多大。

蠕虫不是模型在训练中看到的无虫苹果的一部分,因此它的像素得到了更高的分数。

一个异常检测模型学习没有异常的图像的共同特征。

训练后的模型将推断出输入图像只包含学习过的特征的可能性有多大,还是该图像包含不同的东西。

后一个被解释为异常。

此推理结果作为灰度图像返回。

其中的像素值表示输入图像像素中相应像素显示异常的可能性有多大。

一般工作流程在本节中,我们描述了基于深度学习的异常检测任务的一般流程。

预处理数据这一部分是关于如何预处理数据的。

1. 需要转换数据集的信息内容。

这是通过函数read_dl_dataset_anomaly来完成的。

它创建了一个字典DLDataset,它充当一个数据库,存储关于您的数据的所有必要信息。

要了解更多关于数据及其传输方式的信息,请参阅下面的“数据”一节和深度学习/模型一章。

2. 拆分字典DLDataset表示的数据集。

这可以使用函数split_dl_dataset来完成。

3. 网络对图像有几个要求。

可以使用函数get_dl_model_param检索这些需求(例如图像大小和灰度值范围)。

为此,您需要首先通过函数read_dl_model读取模型。

4. 现在可以对数据集进行预处理了。

为此,您可以使用该函数preprocess_dl_dataset。

对于自定义预处理,本函数提供了实现的指导。

要使用这个函数,请指定预处理参数,例如,图像的大小。

将所有参数及其值存储在DLPreprocessParam字典中,您可以使用该函数create_dl_preprocess_param。

我们建议保存这个字典DLPreprocessParam,以便稍后在推理阶段访问预处理参数值。

博客halcon学习经验

博客halcon学习经验

HALCON是当今machine vision技术的代表,它总是以最新科技为基础,提供了现今市场中最强大的vision library。

除了提供了完整的标准machine vision功能,还有一系列优异的功能,例如,3D相机校正,形状以及原件导向的匹配,次像元精度的物体撷取,计算,利用双像立体量测,任意形状的ROI,以及更多的功能。

用HALCON 来开发程序的流程:1 、利用 HDevelop 检视分析影像,建立计算雏形,最后完成视觉计算方法的发展。

程序可以分成不同的子程序,每个procedures 可以只做一件事,像初始化,计算,或是清除。

主程序用于呼叫其它子程序,传递影像或是接收显示结果。

最后,程序输出成我们要用的程序代码,接续下一步工作。

2 、完整的程序发展是在程序设计环境中进行,像是 Microsoft Visual Studio 。

由 HDevelop 输出的程序代码,透过指令加入程序中 ( 例如 include) 。

至于程序的接口等等则是利用程序语言的功能来建构,接下来, compiled and linked ,产生应用程序。

自行撰写的程序和 HALCON library 一起装入机器中出货,或是将程序卖到客户处。

参数和数据结构:HALCON 有两种基本的数据型态 : 图像数据 (iconic ,例如影像 ) 以及控制数据 ( control ,例如变量,整数,字符串,handle 等等 ) 。

所有运算子的参数都是以相同的方式排列:输入图像,输出图像,输入控制,输出控制。

当然,并非所有的运算子都具有上列四类参数,不过参数排列的次序依旧相同。

ROI :影像中要处理的数据范围。

region 即是一堆像元的集合。

region 中的像元不一定要相连,如果要让相连接的像元成为一个 region ,只要呼叫运算子 connection 即可。

XLD 包含了所有等值线以及多边型的数据。

XLD 对象中除了点坐标数据,还包含了全域或区域属性,例如 edge 方向,或是分割时的 regression 参数等等。

HALCON运算符及功能-中文

HALCON运算符及功能-中文

HALCON运算符及功能Chapter1:Classification1.1Gaussian-Mixture-Models1.add_sample_class_gmm功能:把一个训练样本添加到一个高斯混合模型的训练数据上。

2.classify_class_gmm功能:通过一个高斯混合模型来计算一个特征向量的类。

3.clear_all_class_gmm功能:清除所有高斯混合模型。

4.clear_class_gmm功能:清除一个高斯混合模型。

5.clear_samples_class_gmm功能:清除一个高斯混合模型的训练数据。

6.create_class_gmm功能:为分类创建一个高斯混合模型。

7.evaluate_class_gmm功能:通过一个高斯混合模型评价一个特征向量。

8.get_params_class_gmm功能:返回一个高斯混合模型的参数。

9.get_prep_info_class_gmm功能:计算一个高斯混合模型的预处理特征向量的信息内容。

10.get_sample_class_gmm功能:从一个高斯混合模型的训练数据返回训练样本。

11.get_sample_num_class_gmm功能:返回存储在一个高斯混合模型的训练数据中的训练样本的数量。

12.read_class_gmm功能:从一个文件中读取一个高斯混合模型。

13.read_samples_class_gmm功能:从一个文件中读取一个高斯混合模型的训练数据。

14.train_class_gmm功能:训练一个高斯混合模型。

15.write_class_gmm功能:向文件中写入一个高斯混合模型。

16.write_samples_class_gmm功能:向文件中写入一个高斯混合模型的训练数据。

1.2Hyperboxes1.clear_sampset功能:释放一个数据集的内存。

2.close_all_class_box功能:清除所有分类器。

halcon中设置xld线宽的算子

halcon中设置xld线宽的算子

一、Halcon中XLD线宽概述Halcon是一种用于机器视觉应用的强大软件,其提供了一系列的图像处理和分析工具。

在Halcon中,XLD是一种表示线的数据结构,而线宽则是指线的粗细程度。

通过调整线宽,可以改变线在图像中的显示效果,从而影响后续的图像分析和处理结果。

二、Halcon中设置XLD线宽的算子在Halcon中,可以通过使用相应的算子来设置XLD线宽,下面介绍一些常用的操作:1. gen_xld_contour_polygon: 该算子用于生成多边形轮廓,可以通过指定线宽参数来设置线的宽度。

2. draw_xld: 该算子用于在图像上绘制XLD对象,可以通过指定线宽参数来设置线的宽度。

3. set_xld_attrib: 该算子用于设置XLD对象的属性,可以通过指定线宽参数来改变线的宽度。

4. set_line_width: 该算子用于设置XLD对象中线段的宽度。

以上算子可以根据具体的需求和场景来选择合适的方法来设置XLD线宽,从而满足不同的应用需求。

三、Halcon中设置XLD线宽的应用案例为了更好地理解在Halcon中设置XLD线宽的方法和应用场景,下面给出一个简单的应用案例:假设我们需要在一张工件图像中检测并测量其中的线段,但由于图像噪声较大导致线段看上去比较模糊。

这时我们可以利用Halcon中设置XLD线宽的算子来增加线段的宽度,使其更容易被检测和测量。

我们可以使用gen_xld_contour_polygon算子来生成线段的多边形轮廓,并通过设置线宽参数来增加线段的宽度。

然后使用draw_xld算子将处理后的线段绘制到原始图像上,以便后续的检测和测量。

通过这样的处理,我们可以更准确地检测和测量图像中的线段,提高图像处理的精度和稳定性。

四、结论通过对Halcon中设置XLD线宽的算子进行介绍和应用案例的讲解,我们可以看到这些算子在图像处理和分析中的重要作用。

通过灵活运用这些算子,可以满足不同场景下的图像处理需求,提高图像处理的效率和准确性。

Halcon学习(10)边缘检测(一)

Halcon学习(10)边缘检测(一)

Halcon学习(十)边缘检测(一)边缘检测的定义:使用数学方法提取图像像元中具有亮度值(灰度)空间方向梯度大的边、线特征的过程。

边缘是指周围像素灰度有阶跃变化或屋顶等变化的那些像素的集合。

图像的边缘对应着图像灰度的不连续性。

显然图像的边缘很少是从一个灰度跳到另一个灰度这样的理想状况。

真实图像的边缘通常都具有有限的宽度呈现出陡峭的斜坡状。

边缘的锐利程度由图像灰度的梯度决定。

梯度是指灰度变化的最快的方向和数量。

常见的边缘点有三种:第一种是阶梯形边缘 (Step-edge), 即从一个灰度到比它高好多的另一个灰度。

第二种是屋顶型边缘 (Roof-edge), 它的灰度是慢慢增加到一定程度然后慢慢减小。

还有一种是线性边缘 (Line-edge), 它的灰度从一级别跳到另一个灰度级别之后然后回来。

边缘检测的方法主要有以下几种:第一种检测梯度的最大值。

由于边缘发生在图像灰度值变化比较大的地方 ,对应连续情形就是说是函数梯度较大的地方,所以研究比较好的求导算子就成为一种思路。

Roberts 算子、 Prewitt 算子和 Sobel 算子等就是比较简单而常用的例子。

还有一种比较直观的方法就是利用当前像素邻域中的一些像素值拟合一个曲面 , 然后求这个连续曲面在当前像素处梯度。

从统计角度来说 , 我们可以通过回归分析得到一个曲面 , 然后也可以做类似的处理。

第二种是检测二阶导数的零交叉点。

这是因为缘处的梯度取得最大值 ( 正的或者负的 ), 也就是灰度图像的拐点是边缘。

从分析学上我们知道 , 拐点处函数的二阶导数是 0 。

第三种,统计型方法。

比如说利用假设检验来检测边缘中利用对二阶零交叉点的统计分析得到了图像中各个像素是边缘的概率,并进而得到边缘检测的方案。

1.sobel_amp(Image : EdgeAmplitude : FilterType, Size : )根据图像的一次导数计算图像的边缘程序如下:read_image (Image, 'fabrik')sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)threshold (EdgeAmplitude, Region, 10, 255)skeleton (Region, Skeleton)dev_display (Image)dev_set_color ('white')dev_display (Skeleton)ImageEdgeAmplitudeSkeletonsobel_amp( Image : EdgeAmplitude : FilterType, Size : )根据图像的一次导数计算图像的边缘close_edges( Edges, EdgeImage : RegionResult :MinAmplitude : )close_edges_length( Edges, Gradient : ClosedEdges : MinAmplitude, MaxGapLength : ) 使用边缘高度图像关闭边缘间隙。

Halcon学习笔记--数组操作和文件(4)

Halcon学习笔记--数组操作和文件(4)

Halcon学习笔记--数组操作和⽂件(4)⼀、数组操作对数组可以完成整体赋值,区域赋值,数组之间赋值,某个元素赋值(这个很类似Matlab)count_seconds(T1)Htuple1 := [1,2,3,4,5,6]Htuple3 := sin(Htuple1)*数组元素修改Htuple1[2] := 'ABC'*数组区域修改Htuple1[1:3] := ['ccc','ddd','eee']*数组之间赋值Htuple2 := Htuple1[1:|Htuple1|-1]count_seconds(T2)T3 := T2-T1逐步运⾏count_seconds(t)算⼦是计算程序运⾏的时间;⼆、⽂件操作⽂件操作包括读和写,⽂件格式有:Text,图像,区域等,常⽤算⼦解释如下:1.open_file( : : , : ):'output':创建新的⽂本,⽤write‘append':在原有的⽂本基础上写⼊该⽂件'input':打开⽂件,打开⼀个已经存在的⽂件,⽤以read2.fwrite_string( : : , : )写⼊⽂件3.fnew_line( : : : )换⾏4.close_file( : : : )关闭⽂件5.fread_char( : : : )读⼊字符6.fread_line( : : : , )⾏读取,IsEOF:判断是否到了⽂本⽂件的末尾7.fread_string( : : : , )read_image (Image, 'fabrik')*区域增长算⼦regiongrowing (Image, Regions, 3, 3, 6, 100)count_obj (Regions, Number)*创建⼀个即将要⼊数值⽂件open_file ('E:/欣奕华/项⽬/Halcon/STUDY/⽹络课程笔记/1.⽂件数组/area.dat', 'output', FileHandle)for I := 1 to Number by 1*选择区域select_obj (Regions, ObjectSelected, I)area_center (ObjectSelected, Area, Row, Column)*⽂件要写⼊值fwrite_string (FileHandle, I + ' ' + 'Row :'+ Row + ' Column :'+ Column + 'Area :'+Area )*换⾏fnew_line (FileHandle)endforregiongrowing (Image, Regions, 3, 3, 6, 100) 区域增长算⼦函数作⽤:⽤区域⽣长实现图像分割函数原理:如果相邻像素的灰度值差⼩于等于Tolerance,则被融为⼀个区域。

2024 halcon机器视觉算法与

2024      halcon机器视觉算法与

2024 halcon机器视觉算法与2024年,Halcon机器视觉算法经历了一系列的更新与发展,不断推动着机器视觉技术的进步。

在这一年,Halcon推出了全新的深度学习算法,极大地提升了机器视觉在图像处理和分析方面的能力。

新的深度学习算法采用了先进的卷积神经网络架构,能够通过学习大量的图像样本来进行图像分类、目标检测和图像分割等任务。

相比传统的机器学习算法,深度学习算法具有更高的准确性和鲁棒性。

此外,Halcon还引入了一系列的先进特征提取算法,如SIFT、SURF和ORB等,用于快速而准确地提取图像中的关键特征。

这些算法基于图像的局部特征,能够在光照变化、遮挡等复杂环境下仍然具有很好的稳定性。

在图像匹配和物体定位方面,Halcon的机器视觉算法也有了飞跃性的进步。

通过使用新的匹配算法和优化技术,Halcon能够在大规模图像数据库中快速地找到最佳匹配,并估计出物体的位置和姿态。

此外,Halcon还针对不同应用领域推出了一些专门的算法模块,如工业自动化、医疗影像和智能交通等。

这些算法模块具有针对性,能够在特定的应用场景下实现更高的检测准确性和处理速度。

综上所述,2024年的Halcon机器视觉算法通过引入深度学习算法、先进特征提取算法和优化技术等,不断提升了机器视觉的性能和功能,推动了机器视觉技术的发展。

此外,2024年Halcon机器视觉算法还进一步优化了图像处理和分析的速度和稳定性。

通过针对不同硬件平台进行底层优化和算法并行处理,Halcon能够在较短的时间内处理大量的图像数据,并实时输出准确的分析结果。

在图像识别和分类方面,Halcon引入了基于深度学习的卷积神经网络模型,通过大规模训练数据集的学习,实现了更高的分类准确率。

这使得Halcon可以广泛应用于物体识别、人脸识别和文字识别等领域,为各行各业提供更精准和智能的解决方案。

随着人工智能技术的不断发展,Halcon还将机器学习和深度学习技术与传统机器视觉算法相结合,实现更强大的功能和更高的鲁棒性。

Halcon学习(3)赋值与数组操作

Halcon学习(3)赋值与数组操作

Halcon学习(三)赋值与数组操作assign :对数据赋值,对数组的初始化。

但不能对数组中的某一个值进行赋值。

举例:Tuple1 := [1,0,3,4,5,6,7,8,9] // 对数组进行初始化Val := sin(1.2) + cos(1.2) // 对某一个值进行赋值Tuple2 := [] // 数组定义assign_at :对数组中的某一个值进行赋值。

举例:Tuple1[1] := 2 // 将Input 和Result 赋值为Tuple12.Insert :对数组中的某一个值进行赋值。

Tuple1 := [1,0,3,4,5,6,7,8,9]Tuple1[3]:=2显示结果为:[1, 0, 3, 2, 5, 6, 7, 8, 9],即对索引3后面元素,数组Tuple1中第4个元素赋值2.example:read_image (Mreut, 'mreut') //读入图像threshold (Mreut, Region, 190, 255) //阈值化,输出阈值在190-255的RegionsAreas := [] //定义数组Areasfor Radius := 1 to 50 by 1 //循环dilation_circle (Region, RegionDilation, Radius) //利用半径为Radius的圆对Region进行膨胀运算,输出RegionDilation,输出形式仍然为Region。

area_center (RegionDilation, Area, Row, Column) //输出区域的面积和中心像素坐标Areas[Radius-1] := Area //对数组Areas的第Radius-1个元素进行赋值endfor3.基本数组操作极其对应的算子t := [t1,t2] t1,t2连接成新的数组对应算子:tuple_concati := |t| 得到数组长度 tuple_lengthv := t[i] 选取第i个元素0<= i < |t| tuple_selectt := t[i1:i2] 选取i1到i2的元素 tuple_select_ranget := subset(t,i) 选取数组t中的第i个元素 tuple_selectt := remove(t,i) 去除数组t中的第i个元素 tuple_removei := find(t1,t2) 找到t2数组在t1数组中出现位置索引(or -1 if no match) tuple_findt := uniq(t) 在t数组中把连续相同的值只保留一个tuple_uniq4.创建数组(1)gen_tuple_const函数tuple := gen_tuple_const(100,4711) //创建一个具有100个元素的,每个元素都为4711的数据tuple_new := gen_tuple_const(|tuple_old|,4711) //创建一个和原来数据长度一样的数据上面的函数也可以通过如下表达式实现:tuple_new := (tuple_old * 0) + 4711(2)当数组中的元素不同时,需要用循环语句对数组中的每一个元素赋值例如:tuple := [] //创建空数组for i := 1 to 100 by 1 //建立步长为1的循环tuple := [tuple,i*i] //将i方的值赋给数组的第i个元素endfor //循环结束成长总需要风雨,泪水总饱含主爱1、求数组元素的最大值tuple_max(Array,Max)2、求数组元素的最小值tuple_min(Array,Min)3、求数组元素的平均值tuple_mean(Array,Mean)4、求数组元素的绝对值tuple_abs(Array,Abs)5、两个数组相加tuple_add(Array1,Array2,Sum)6、两个数组相减tuple_sub(Array1,Array2,Sub)5、选择数组里面一定范围的元素组成新数组tuple_select_range(Array,LeftIndex,RightIndex,ArraySelect)6、将两个数组相连接tuple_concat(Array1,Array2,Concat)7、将两个数组元素逻辑与tuple_and(Array1,Array2,And)8、将两个数组元素逻辑或tuple_or(Array1,Array2,Or)9、给数组元素升序排序tuple_sort(Array,Sorted)10、给数组元素升序排序返回的数组元素是排好序的元素原来的下标tuple_sort_index(Array,Indices)11、反转一个数组tuple_inverse(Array,Inverted)12、比较两个数组是否相等tuple_equal(Array1,Array2,Equal)13、计算数组元素对应的弧度的角度tuple_deg(Array,Deg)14、在数组1中寻找数组2,如果有返回第一个元素对应的下标,否则返回-1 tuple_find(Array1,Array2,Indices)15、获取数组的长度tuple_length(Array,Length)16、比较两个数组的对应元素,取每个大值放于结果中tuple_max2(Array1,Array2,Max2)17、比较两个数组的对应元素,取每个小值放于结果中tuple_min2(Array1,Array2,Min2)18、区数组元素的中值tuple_median(Array,Median)19、将数组元素值由角度值转换为弧度值tuple_rad(Array,Rad)20、将数组元取反(正负转换)tuple_neg(Array,Neg)。

halcon 异常检测算法原理

halcon 异常检测算法原理

Halcon 异常检测算法原理一、简介Halcon是一种广泛应用于工业领域的机器视觉软件,具有强大的图像处理和分析能力。

其中,异常检测算法是Halcon在质检和生产过程中的重要应用之一。

本文将介绍Halcon中异常检测算法的原理和应用。

二、算法原理1. 图像采集和预处理异常检测算法首先需要获取需要分析的图像数据。

Halcon可以连接各种不同的相机和图像采集设备,获取高质量的图像。

对图像进行预处理,包括去噪、平滑和边缘增强等操作,以提高后续分析的准确性和鲁棒性。

2. 特征提取在异常检测中,特征提取是至关重要的一步。

Halcon提供了丰富的图像特征提取工具,可以提取出图像中的几何特征、纹理特征和光学特征等。

这些特征可以帮助算法更好地理解图像内容,并为后续的异常检测提供依据。

3. 异常检测模型Halcon中采用了多种异常检测模型,包括基于统计学、机器学习和深度学习的模型。

在基于统计学的模型中,Halcon可以利用图像的统计特征,如均值、方差和偏度等,来进行异常检测。

在机器学习和深度学习模型中,Halcon可以利用已有的标注数据进行训练,建立异常检测模型。

4. 异常检测在异常检测模型建立完成后,Halcon可以对新的图像进行异常检测。

通过对图像的特征进行提取,并输入到异常检测模型中,可以得到图像的异常检测结果。

如果图像中存在异常情况,算法会输出相应的异常标记或者告警信息。

三、应用场景Halcon的异常检测算法在工业生产中有着广泛的应用。

在电子制造业中,可以利用异常检测算法来检测PCB板的焊接质量;在汽车零部件制造中,可以利用异常检测算法来检测零件的表面缺陷等。

异常检测算法可以帮助企业及时发现生产中的问题,提高产品质量和生产效率。

四、总结Halcon的异常检测算法基于先进的图像处理和机器学习技术,可以对工业生产中的图像数据进行准确、快速的异常检测。

通过合理的图像预处理、特征提取和异常检测模型的应用,Halcon在异常检测领域具有显著的优势,为工业生产提供了强有力的技术支持。

halcon新手手册_1.0.1(修)

halcon新手手册_1.0.1(修)

1.无论读入什么图像,读入图像显示效果明显和原始图像不一致,哪怕是从相机读入的图像,也是明显颜色差异。

什么原因引起?初步诊断是,显示的时候调用的颜色查找表存在异常不是default ,而是其它选项。

此时可以通过查阅相关参数,调用set_system解决,也可以在编辑-》参数选择-》颜色查找表进行更改。

2.裁剪图像;从图像上截取某段图像进行保存。

如何实现该操作?首先应该知道,region不具有单独构成图像的要素,他没有灰度值。

有用过opencv的应该知道ROI(感兴趣区域),设置好它后,对图像的大部分操作就转为图像的一个矩形区域内进行。

类似的,halcon有domain 概念。

首先设置好一个矩形区,然后使用reduce_domain(是一个矩形区域)后,再使用crop_domain 就裁剪出图像。

3.读入bmp,或tiff 图像显示该图不是bmp文件或不能读。

原因是什么?这个常有新手询问,画图,图像管理器都能打开,又或者是相机采集完直接存到硬盘。

Halcon 读取图像在windows下面到最后是调用windows库函数实现读图功能。

咱不清楚到底是怎么调用的。

对于图像格式,在读图函数F1说明很细。

基本bmp 如果文件头不是bw还是bm(百度百科bmp格式查找,编写此处时无网络,后续可能忘记),就读不进来。

其他规格欢迎补充。

解决办法,如果是相机采集,就在内存直接转换(参见halcon到VC.pdf 里面的halcon和bitmap互转);如果是采完的图片,大部分通过画图工具转换为24位bmp 格式,即可解决。

4.读入avi文件报错。

Halcon 通过directshow或另一个格式解析视频,正常来说应该可以读入市面大部分视频,实际测试发现只能读入最标准的avi文件格式。

如果需要临时处理,需要下格式工厂等工具转化为最标准的avi文件格式(论坛叶诺有发帖说明)。

5.Region 或xld 筛选。

Halcon提供了丰富的region 和xld筛选方法。

halcon学习经验

halcon学习经验

HalCon学习经验总结1.图像的开运算和闭运算算子开运算就是用消除图像上的小物体,小区域,将纤细相连的物体分开,将大物体的表面平滑与此同时不明显改变他的面积。

扩大背景(就是暗的部分),缩小前景(就是亮的部分)。

模板匹配等闭运算就是填充物体内细小的空洞,连接邻近的物体,平滑物体的边界同时呢不明显改变他的面积。

缩小背景(就是暗的部分),扩大前景(就是亮的部分)开运算:先对图像腐蚀然后膨胀闭运算:先对图像膨胀然后腐蚀必要的解释:一:HALCON提供了开运算、闭运算的函数(算子),根据结构元素的不同(圆的方的椭圆的或是自己定义也可以)细化出很多算子。

这些都是细枝末节。

此处不再赘余。

二:开闭运算的结构元素没有参考点(中心点)的概念。

三:开闭运算没有迭代的概念,就是图像被同样结构元素做开运算,处理一次和处理随意非零次的效果是一样的。

gray_opening_rect (ImageInvert, ImageOpening, 20, 20)gray_closing_rect (ImageInvert, ImageClosing, 20, 20)connection (ImageOpening,tophat)connection (ImageClosing,bothat)sub_image (bothat,tophat,ImageSub, 1, 0)union1 (ImageSub, RegionUnion)2.击中击不中(hit_or_miss),加厚(thickening),打薄(thinning)thickening:原始图像+ 对图像使用击中击不中产品的图像thinning:原始图像- 对图像使用击中击不中产品的图像击中击不中原理继膨胀、腐蚀、开运算和闭运算之后的有一个基本操作就是击中击不中变换(HMT),HMT变换可以同时探测图像的内部和外部。

在研究图像中的目标物体与图像背景之间的关系上,HMT能够取得很好的效果。

halcon算子学习笔记—devlope算子1

halcon算子学习笔记—devlope算子1

Halcon算子学习笔记1.dev_clear_object(object:::)从当前程序的变量库中清除指定的图像变量,一旦清除,后续将不能访问该变量。

2.dev_clear_window(:::)清除当前活动窗口中显示的图像变量。

窗口的所设置参数不会被改变。

3.dev_close_inspect_ctrl(::variable:)与dev_inspect_ctrl相对的算子。

通过指定varibale,可以消除该变量在窗口中的显示,一旦所有的变量都使用该算子,则所有的变量就会被删除,此时,窗口就会被关闭。

4.dev_close_tool(::toolid:)该算子通过指定工具的ID号码关闭对应的工具。

如果不指定id号码,可以使用工具的名字。

5.dev_close_window(:::);关闭活动的图形窗口,包括被dev_open_window打开的窗口或者程序自动打开的默认窗口。

6.dev_display(object:::);将object图像变量显示在活动的窗口中,此算子相当与双击图像变量,实际上,双击图像变量,也可以将图像显示在活动窗口中。

7.dev_error_var(:errorvar:mode:)定义一个错误变量,并开启或者关闭该变量。

如果开启了该错误变量,则每执行一个算子,该变量的取值就会根据算子的执行情况进行更新,如果算子执行正确,则返回2。

8.dev_get_exception_data()获取错误信息。

错误信息有catch捕捉后,可以通过该算子查询错误状况。

9.Dev_get_preferences()该算子可以查询hdevlop的参数设置情况,与dev_set_preferences算子相对应。

10.dev_get_system(::systemquerys:systeminformations)获取当前的系统信息。

其中,systemquery的取值为engine_environment,其返回值根据使用的环境不同,返回Hdevelop或者Hdevengine。

halcon学习经验

halcon学习经验

HalCon学习经验总结1.图像的开运算和闭运算算子开运算就是用消除图像上的小物体,小区域,将纤细相连的物体分开,将大物体的表面平滑与此同时不明显改变他的面积。

扩大背景(就是暗的部分),缩小前景(就是亮的部分)。

模板匹配等闭运算就是填充物体内细小的空洞,连接邻近的物体,平滑物体的边界同时呢不明显改变他的面积。

缩小背景(就是暗的部分),扩大前景(就是亮的部分)开运算:先对图像腐蚀然后膨胀闭运算:先对图像膨胀然后腐蚀必要的解释:一:HALCON提供了开运算、闭运算的函数(算子),根据结构元素的不同(圆的方的椭圆的或是自己定义也可以)细化出很多算子。

这些都是细枝末节。

此处不再赘余。

二:开闭运算的结构元素没有参考点(中心点)的概念。

三:开闭运算没有迭代的概念,就是图像被同样结构元素做开运算,处理一次和处理随意非零次的效果是一样的。

gray_opening_rect (ImageInvert, ImageOpening, 20, 20)gray_closing_rect (ImageInvert, ImageClosing, 20, 20)connection (ImageOpening,tophat)connection (ImageClosing,bothat)sub_image (bothat,tophat,ImageSub, 1, 0)union1 (ImageSub, RegionUnion)2.击中击不中(hit_or_miss),加厚(thickening),打薄(thinning)thickening:原始图像+ 对图像使用击中击不中产品的图像thinning:原始图像- 对图像使用击中击不中产品的图像击中击不中原理继膨胀、腐蚀、开运算和闭运算之后的有一个基本操作就是击中击不中变换(HMT),HMT变换可以同时探测图像的内部和外部。

在研究图像中的目标物体与图像背景之间的关系上,HMT能够取得很好的效果。

Halcon导出C#代码结构学习

Halcon导出C#代码结构学习

Halcon导出C#代码结构学习// File generated by HDevelop for HALCON/DOTNET (C#) Version 10.0// 这个文件是 Halcon 10.0 版本导出的 C# 代码// 函数体// 变量声明// 主要的处理函数// 异常捕获与处理// 内存释放// 主函数////// 添加对HalconDotNet的引用using HalconDotNet;// 导出的类名: HDevelopExportpublic partial class HDevelopExport{#if !NO_EXPORT_APP_MAIN//构造函数public HDevelopExport(){// Default settings used in HDevelopHOperatorSet.SetSystem("do_low_error", "false");action();}#endif// Procedures 函数体// External procedures 外部函数体// Chapter: Matching / Shape-Based 匹配// Short Description: Display the results of Shape-Based Matching.简述函数功能:显示形状匹配的结果public void dev_display_shape_matching_results (HTuple hv_ModelID, HTuple hv_Color,HTuple hv_Row, HTuple hv_Column, HTuple hv_Angle, HTuple hv_ScaleR, HTuple hv_ScaleC,HTuple hv_Model){// Local iconic variables// 局部图像变量HObject ho_ModelContours=null, ho_ContoursAffinTrans=null;// Local control variables// 局部控制变量HTuple hv_NumMatches, hv_Index=new HTuple();HTuple hv_Match=new HTuple(), hv_HomMat2DIdentity=new HTuple();HTuple hv_HomMat2DScale=new HTuple(), hv_HomMat2DRotate=new HTuple();HTuple hv_HomMat2DTranslate=new HTuple();HTuple hv_Model_COPY_INP_TMP = hv_Model.Clone();HTuple hv_ScaleC_COPY_INP_TMP = hv_ScaleC.Clone();HTuple hv_ScaleR_COPY_INP_TMP = hv_ScaleR.Clone();// Initialize local and output iconic variablesHOperatorSet.GenEmptyObj(out ho_ModelContours);HOperatorSet.GenEmptyObj(out ho_ContoursAffinTrans);try{//This procedure displays the results of Shape-Based Matching.//这个函数处理过程的作用是显示匹配的结果hv_NumMatches = new HTuple(hv_Row.TupleLength());if ((int)(new HTuple(hv_NumMatches.TupleGreater(0))) != 0) {if ((int)(new HTuple((new HTuple(hv_ScaleR_COPY_INP_TMP.TupleLength())).TupleEqual(1))) != 0){HOperatorSet.TupleGenConst(hv_NumMatches,hv_ScaleR_COPY_INP_TMP, out hv_ScaleR_COPY_INP_TMP);}if ((int)(new HTuple((new HTuple(hv_ScaleC_COPY_INP_TMP.TupleLength())).TupleEqual(1))) != 0){HOperatorSet.TupleGenConst(hv_NumMatches,hv_ScaleC_COPY_INP_TMP, out hv_ScaleC_COPY_INP_TMP);}if ((int)(new HTuple((new HTuple(hv_Model_COPY_INP_TMP.TupleLength())).TupleEqual(0))) != 0){HOperatorSet.TupleGenConst(hv_NumMatches, 0, out hv_Model_COPY_INP_TMP);}else if ((int)(new HTuple((new HTuple(hv_Model_COPY_INP_TMP.TupleLength())).TupleEqual(1))) != 0){HOperatorSet.TupleGenConst(hv_NumMatches,hv_Model_COPY_INP_TMP, out hv_Model_COPY_INP_TMP);}for (hv_Index=0; (int)hv_Index<=(int)((new HTuple(hv_ModelID.TupleLength()))-1); hv_Index = (int)hv_Index + 1){ho_ModelContours.Dispose();HOperatorSet.GetShapeModelContours(outho_ModelContours, hv_ModelID.TupleSelect(hv_Index), 1);if (HDevWindowStack.IsOpen()){HOperatorSet.SetColor(HDevWindowStack.GetActive(),hv_Color.TupleSelect(hv_Index%(new HTuple(hv_Color.TupleLength()))));}for (hv_Match=0; hv_Match.Continue(hv_NumMatches-1, 1); hv_Match = hv_Match.TupleAdd(1)){if ((int)(new HTuple(hv_Index.TupleEqual(hv_Model_COPY_INP_TMP.TupleSel ect(hv_Match)))) != 0){HOperatorSet.HomMat2dIdentity(outhv_HomMat2DIdentity);HOperatorSet.HomMat2dScale(hv_HomMat2DIdentity,hv_ScaleR_COPY_INP_TMP.TupleSelect(hv_Match),hv_ScaleC_COPY_INP_TMP.TupleSelect(hv_Match), 0, 0, out hv_HomMat2DScale);HOperatorSet.HomMat2dRotate(hv_HomMat2DScale,hv_Angle.TupleSelect(hv_Match), 0, 0, out hv_HomMat2DRotate);HOperatorSet.HomMat2dTranslate(hv_HomMat2DRotate, hv_Row.TupleSelect(hv_Match), hv_Column.TupleSelect(hv_Match), out hv_HomMat2DTranslate);ho_ContoursAffinTrans.Dispose();HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ContoursAffinTrans,hv_HomMat2DTranslate);if (HDevWindowStack.IsOpen()){HOperatorSet.DispObj(ho_ContoursAffinTrans, HDevWindowStack.GetActive());}}}}}// 内存释放ho_ModelContours.Dispose();ho_ContoursAffinTrans.Dispose();return;}//捕获异常catch (HalconException HDevExpDefaultException){ho_ModelContours.Dispose();ho_ContoursAffinTrans.Dispose();//处理异常throw HDevExpDefaultException;}}// Chapter: Develop// Short Description: Switch dev_update_pc, dev_update_var and dev_update_window to 'off'.public void dev_update_off (){// Initialize local and output iconic variables//This procedure sets different update settings to 'off'.//This is useful to get the best performance and reduce overhead.//// dev_update_pc(...); only in hdevelop// dev_update_var(...); only in hdevelop// dev_update_window(...); only in hdevelopreturn;}// Chapter: Graphics / Text// Short Description: This procedure writes a text message.public void disp_message (HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem,HTuple hv_Row, HTuplehv_Column, HTuple hv_Color, HTuple hv_Box){// Local control variablesHTuple hv_Red, hv_Green, hv_Blue, hv_Row1Part;HTuple hv_Column1Part, hv_Row2Part, hv_Column2Part, hv_RowWin;HTuple hv_ColumnWin, hv_WidthWin, hv_HeightWin, hv_MaxAscent;HTuple hv_MaxDescent, hv_MaxWidth, hv_MaxHeight, hv_R1=new HTuple();HTuple hv_C1=new HTuple(), hv_FactorRow=new HTuple(), hv_FactorColumn=new HTuple();HTuple hv_Width=new HTuple(), hv_Index=new HTuple(), hv_Ascent=new HTuple();HTuple hv_Descent=new HTuple(), hv_W=new HTuple(), hv_H=new HTuple();HTuple hv_FrameHeight=new HTuple(), hv_FrameWidth=new HTuple();HTuple hv_R2=new HTuple(), hv_C2=new HTuple(), hv_DrawMode=new HTuple();HTuple hv_Exception=new HTuple(), hv_CurrentColor=new HTuple();HTuple hv_Color_COPY_INP_TMP = hv_Color.Clone();HTuple hv_Column_COPY_INP_TMP = hv_Column.Clone();HTuple hv_Row_COPY_INP_TMP = hv_Row.Clone();HTuple hv_String_COPY_INP_TMP = hv_String.Clone();// Initialize local and output iconic variables//This procedure displays text in a graphics window.////Input parameters://WindowHandle: The WindowHandle of the graphicswindow, where// the message should be displayed//String: A tuple of strings containing the text message to be displayed//CoordSystem: If set to 'window', the text position is given // with respect to the window coordinate system.// If set to 'image', image coordinates are used.// (This may be useful in zoomed images.)//Row: The row coordinate of the desired text position// If set to -1, a default value of 12 is used.//Column: The column coordinate of the desired text position// If set to -1, a default value of 12 is used.//Color: defines the color of the text as string.// If set to [], '' or 'auto' the currently set color is used.// If a tuple of strings is passed, the colors are used cyclically // for each new textline.//Box: If set to 'true', the text is written within a white box.////prepare windowHOperatorSet.GetRgb(hv_WindowHandle, out hv_Red, out hv_Green, out hv_Blue);HOperatorSet.GetPart(hv_WindowHandle, out hv_Row1Part, out hv_Column1Part, out hv_Row2Part,out hv_Column2Part);HOperatorSet.GetWindowExtents(hv_WindowHandle, out hv_RowWin, out hv_ColumnWin,out hv_WidthWin, out hv_HeightWin);HOperatorSet.SetPart(hv_WindowHandle, 0, 0, hv_HeightWin-1, hv_WidthWin-1);////default settingsif ((int)(new HTuple(hv_Row_COPY_INP_TMP.TupleEqual(-1))) != 0){hv_Row_COPY_INP_TMP = 12;}if ((int)(new HTuple(hv_Column_COPY_INP_TMP.TupleEqual(-1))) != 0){hv_Column_COPY_INP_TMP = 12;}if ((int)(new HTuple(hv_Color_COPY_INP_TMP.TupleEqual(new HTuple()))) != 0) {hv_Color_COPY_INP_TMP = "";}//hv_String_COPY_INP_TMP = (((""+hv_String_COPY_INP_TMP)+"")).TupleSplit("\n");////Estimate extentions of text depending on font size.HOperatorSet.GetFontExtents(hv_WindowHandle, out hv_MaxAscent, out hv_MaxDescent,out hv_MaxWidth, out hv_MaxHeight);if ((int)(new HTuple(hv_CoordSystem.TupleEqual("window"))) != 0) {hv_R1 = hv_Row_COPY_INP_TMP.Clone();hv_C1 = hv_Column_COPY_INP_TMP.Clone();}else{//transform image to window coordinateshv_FactorRow = (1.0*hv_HeightWin)/((hv_Row2Part-hv_Row1Part)+1);hv_FactorColumn = (1.0*hv_WidthWin)/((hv_Column2Part-hv_Column1Part)+1);hv_R1 = ((hv_Row_COPY_INP_TMP-hv_Row1Part)+0.5)*hv_FactorRow;hv_C1 = ((hv_Column_COPY_INP_TMP-hv_Column1Part)+0.5)*hv_FactorColumn;}////display text box depending on text sizeif ((int)(new HTuple(hv_Box.TupleEqual("true"))) != 0){//calculate box extentshv_String_COPY_INP_TMP = (" "+hv_String_COPY_INP_TMP)+" ";hv_Width = new HTuple();for (hv_Index=0; (int)hv_Index<=(int)((new HTuple(hv_String_COPY_INP_TMP.TupleLength()))-1); hv_Index = (int)hv_Index + 1){HOperatorSet.GetStringExtents(hv_WindowHandle,hv_String_COPY_INP_TMP.TupleSelect(hv_Index), out hv_Ascent, out hv_Descent, out hv_W, out hv_H);hv_Width = hv_Width.TupleConcat(hv_W);}hv_FrameHeight = hv_MaxHeight*(new HTuple(hv_String_COPY_INP_TMP.TupleLength()));hv_FrameWidth = (((new HTuple(0)).TupleConcat(hv_Width))).TupleMax();hv_R2 = hv_R1+hv_FrameHeight;hv_C2 = hv_C1+hv_FrameWidth;//display rectanglesHOperatorSet.GetDraw(hv_WindowHandle, out hv_DrawMode);HOperatorSet.SetDraw(hv_WindowHandle, "fill");HOperatorSet.SetColor(hv_WindowHandle, "light gray");HOperatorSet.DispRectangle1(hv_WindowHandle, hv_R1+3, hv_C1+3, hv_R2+3, hv_C2+3);HOperatorSet.SetColor(hv_WindowHandle, "white");HOperatorSet.DispRectangle1(hv_WindowHandle, hv_R1, hv_C1, hv_R2, hv_C2);HOperatorSet.SetDraw(hv_WindowHandle, hv_DrawMode);}else if ((int)(new HTuple(hv_Box.TupleNotEqual("false"))) != 0) {hv_Exception = "Wrong value of control parameter Box";throw new HalconException(hv_Exception);}//Write text.for (hv_Index=0; (int)hv_Index<=(int)((new HTuple(hv_String_COPY_INP_TMP.TupleLength()))-1); hv_Index = (int)hv_Index + 1){hv_CurrentColor = hv_Color_COPY_INP_TMP.TupleSelect(hv_Index%(newHTuple(hv_Color_COPY_INP_TMP.TupleLength())));if ((int)((new HTuple(hv_CurrentColor.TupleNotEqual(""))).TupleAnd(new HTuple(hv_CurrentColor.TupleNotEqual("auto")))) != 0){HOperatorSet.SetColor(hv_WindowHandle,hv_CurrentColor);}else{HOperatorSet.SetRgb(hv_WindowHandle, hv_Red, hv_Green, hv_Blue);}hv_Row_COPY_INP_TMP = hv_R1+(hv_MaxHeight*hv_Index);HOperatorSet.SetTposition(hv_WindowHandle,hv_Row_COPY_INP_TMP, hv_C1);HOperatorSet.WriteString(hv_WindowHandle,hv_String_COPY_INP_TMP.TupleSelect(hv_Index));}//reset changed window settingsHOperatorSet.SetRgb(hv_WindowHandle, hv_Red, hv_Green, hv_Blue);HOperatorSet.SetPart(hv_WindowHandle, hv_Row1Part,hv_Column1Part, hv_Row2Part,hv_Column2Part);return;}// Chapter: Graphics / Text// Short Description: Set font independent of OSpublic void set_display_font (HTuple hv_WindowHandle, HTuple hv_Size, HTuple hv_Font,HTuple hv_Bold, HTuple hv_Slant){// Local control variablesHTuple hv_OS, hv_Exception=new HTuple();HTuple hv_AllowedFontSizes=new HTuple(), hv_Distances=new HTuple();HTuple hv_Indices=new HTuple();HTuple hv_Bold_COPY_INP_TMP = hv_Bold.Clone();HTuple hv_Font_COPY_INP_TMP = hv_Font.Clone();HTuple hv_Size_COPY_INP_TMP = hv_Size.Clone();HTuple hv_Slant_COPY_INP_TMP = hv_Slant.Clone();// Initialize local and output iconic variables//This procedure sets the text font of the current window with//the specified attributes.//It is assumed that following fonts are installed on the system://Windows: Courier New, Arial Times New Roman//Linux: courier, helvetica, times//Because fonts are displayed smaller on Linux than on Windows,//a scaling factor of 1.25 is used the get comparable results.//For Linux, only a limited number of font sizes is supported, //to get comparable results, it is recommended to use one of the//following sizes: 9, 11, 14, 16, 20, 27//(which will be mapped internally on Linux systems to 11, 14, 17, 20, 25, 34)////input parameters://WindowHandle: The graphics window for which the font will be set//Size: The font size. If Size=-1, the default of 16 is used.//Bold: If set to 'true', a bold font is used//Slant: If set to 'true', a slanted font is used//HOperatorSet.GetSystem("operating_system", out hv_OS);if ((int)((new HTuple(hv_Size_COPY_INP_TMP.TupleEqual(new HTuple()))).TupleOr(new HTuple(hv_Size_COPY_INP_TMP.TupleEqual(-1)))) != 0) {hv_Size_COPY_INP_TMP = 16;}if ((int)(new HTuple((((hv_OS.TupleStrFirstN(2)).TupleStrLastN(0))).TupleEqual( "Win"))) != 0){//set font on Windows systemsif ((int)((new HTuple((new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("mono"))).TupleOr( newHTuple(hv_Font_COPY_INP_TMP.TupleEqual("Courier"))))).TupleOr(new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("courier")))) != 0){hv_Font_COPY_INP_TMP = "Courier New";}else if ((int)(new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("sans"))) != 0) {hv_Font_COPY_INP_TMP = "Arial";}else if ((int)(new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("serif"))) != 0) {hv_Font_COPY_INP_TMP = "Times New Roman";}if ((int)(new HTuple(hv_Bold_COPY_INP_TMP.TupleEqual("true"))) != 0) {hv_Bold_COPY_INP_TMP = 1;}else if ((int)(new HTuple(hv_Bold_COPY_INP_TMP.TupleEqual("false"))) != 0) {hv_Bold_COPY_INP_TMP = 0;}else{hv_Exception = "Wrong value of control parameter Bold";throw new HalconException(hv_Exception);if ((int)(new HTuple(hv_Slant_COPY_INP_TMP.TupleEqual("true"))) != 0) {hv_Slant_COPY_INP_TMP = 1;}else if ((int)(new HTuple(hv_Slant_COPY_INP_TMP.TupleEqual("false"))) != 0) {hv_Slant_COPY_INP_TMP = 0;}else{hv_Exception = "Wrong value of control parameter Slant";throw new HalconException(hv_Exception);}try{HOperatorSet.SetFont(hv_WindowHandle, ((((((("-"+hv_Font_COPY_INP_TMP)+"-")+hv_Size_COPY_INP_TMP)+"-*-")+hv_Slant_COPY_INP_TMP)+"-*-*-")+hv_Bold_COPY_INP_TMP)+"-");}// 捕获异常catch (HalconException HDevExpDefaultException1){//异常处理HDevExpDefaultException1.T oHTuple(out hv_Exception);throw new HalconException(hv_Exception);}else{//set font for UNIX systemshv_Size_COPY_INP_TMP = hv_Size_COPY_INP_TMP*1.25;hv_AllowedFontSizes = new HTuple();hv_AllowedFontSizes[0] = 11;hv_AllowedFontSizes[1] = 14;hv_AllowedFontSizes[2] = 17;hv_AllowedFontSizes[3] = 20;hv_AllowedFontSizes[4] = 25;hv_AllowedFontSizes[5] = 34;if ((int)(new HTuple(((hv_AllowedFontSizes.TupleFind(hv_Size_COPY_INP_TM P))).TupleEqual(-1))) != 0){hv_Distances = ((hv_AllowedFontSizes-hv_Size_COPY_INP_TMP)).TupleAbs();HOperatorSet.TupleSortIndex(hv_Distances, out hv_Indices);hv_Size_COPY_INP_TMP = hv_AllowedFontSizes.TupleSelect(hv_Indices.TupleSelect(0));}if ((int)((new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("mono"))).TupleOr(n ew HTuple(hv_Font_COPY_INP_TMP.TupleEqual("Courier")))) != 0){hv_Font_COPY_INP_TMP = "courier";else if ((int)(new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("sans"))) != 0) {hv_Font_COPY_INP_TMP = "helvetica";}else if ((int)(new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("serif"))) != 0) {hv_Font_COPY_INP_TMP = "times";}if ((int)(new HTuple(hv_Bold_COPY_INP_TMP.TupleEqual("true"))) != 0) {hv_Bold_COPY_INP_TMP = "bold";}else if ((int)(new HTuple(hv_Bold_COPY_INP_TMP.TupleEqual("false"))) != 0) {hv_Bold_COPY_INP_TMP = "medium";}else{hv_Exception = "Wrong value of control parameter Bold";throw new HalconException(hv_Exception);}if ((int)(new HTuple(hv_Slant_COPY_INP_TMP.TupleEqual("true"))) != 0) {if ((int)(new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("times"))) != 0) {hv_Slant_COPY_INP_TMP = "i";}else{hv_Slant_COPY_INP_TMP = "o";}}else if ((int)(new HTuple(hv_Slant_COPY_INP_TMP.TupleEqual("false"))) != 0) {hv_Slant_COPY_INP_TMP = "r";}else{hv_Exception = "Wrong value of control parameter Slant";throw new HalconException(hv_Exception);}try{HOperatorSet.SetFont(hv_WindowHandle, ((((((("-adobe-"+hv_Font_COPY_INP_TMP)+"-")+hv_Bold_COPY_INP_TMP)+"-")+hv_Slant_COPY_INP_TMP)+"-normal-*-")+hv_Size_COPY_INP_TMP)+"-*-*-*-*-*-*-*");}// 捕获异常catch (HalconException HDevExpDefaultException1){HDevExpDefaultException1.T oHTuple(out hv_Exception);throw new HalconException(hv_Exception);}}return;}// Main procedure 主要的函数// 访问修饰符返回值类型函数名称// 类中的私有方法要被外部引用要修改访问修饰符,我们主要用的就是这个函数// 思考:如何把action()拆分成若个个处理步骤(函数)private void action(){// Local iconic variables// 局部图像变量HObject ho_Image=null, ho_Rectangle, ho_ImageReduced;HObject ho_ModelContours;// Local control variables//局部控制变量HTuple hv_Read_Path, hv_FileExists, hv_Width=new HTuple();HTuple hv_Height=new HTuple(), hv_WindowHandle=new HTuple();HTuple hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2;HTuple hv_ModelID, hv_Row1, hv_Column1, hv_Angle, hv_Score;HTuple hv_Number;// Initialize local and output iconic variables//内部和外部图像变量初始化HOperatorSet.GenEmptyObj(out ho_Image);HOperatorSet.GenEmptyObj(out ho_Rectangle);HOperatorSet.GenEmptyObj(out ho_ImageReduced);HOperatorSet.GenEmptyObj(out ho_ModelContours);try{// dev_update_off(...); only in hdevelopif (HDevWindowStack.IsOpen()){HOperatorSet.CloseWindow(HDevWindowStack.Pop());}//文件路径,Htuple 类型的控制变量,在此相当于C#中的Stringhv_Read_Path = "C:/Users/Administrator/Desktop/1.BMP";HOperatorSet.FileExists(hv_Read_Path, out hv_FileExists);if ((int)(hv_FileExists) != 0){ho_Image.Dispose();HOperatorSet.ReadImage(out ho_Image, hv_Read_Path);HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);if (HDevWindowStack.IsOpen()){HOperatorSet.CloseWindow(HDevWindowStack.Pop());}HOperatorSet.SetWindowAttr("background_color","black");HOperatorSet.OpenWindow(0,0,hv_Width,hv_Height,0,"","", out hv_WindowHandle);HDevWindowStack.Push(hv_WindowHandle);set_display_font(hv_WindowHandle, 14, "mono", "true", "false");if (HDevWindowStack.IsOpen()){HOperatorSet.SetDraw(HDevWindowStack.GetActive(), "margin");}if (HDevWindowStack.IsOpen()){HOperatorSet.SetLineWidth(HDevWindowStack.GetActive(), 3);}if (HDevWindowStack.IsOpen()){HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red");}if (HDevWindowStack.IsOpen()){HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());}}else{disp_message(3600, "未找到该文件!", "window", 12, 12, "black", "true");}//设置ROI区域if (HDevWindowStack.IsOpen()){HOperatorSet.SetDraw(HDevWindowStack.GetActive(), "margin");}HOperatorSet.DrawRectangle2(3600, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1,out hv_Length2);ho_Rectangle.Dispose();HOperatorSet.GenRectangle2(out ho_Rectangle, hv_Row, hv_Column, hv_Phi, hv_Length1,hv_Length2);//创建模版ho_ImageReduced.Dispose();HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_ImageReduced);HOperatorSet.CreateShapeModel(ho_ImageReduced, "auto", (new HTuple(-180)).TupleRad(), (new HTuple(360)).TupleRad(), "auto", "auto", "use_polarity", "auto","auto", out hv_ModelID);ho_ModelContours.Dispose();HOperatorSet.GetShapeModelContours(outho_ModelContours, hv_ModelID, 1);//模版匹配HOperatorSet.FindShapeModel(ho_Image, hv_ModelID, (new HTuple(-180)).TupleRad(), (new HTuple(360)).TupleRad(), 0.5, 30, 0.5, "least_squares", 0, 0.9,out hv_Row1, out hv_Column1, out hv_Angle, out hv_Score);if ((int)(new HTuple((newHTuple(hv_Row1.TupleLength())).TupleGreater(0))) != 0) {dev_display_shape_matching_results(hv_ModelID, "red", hv_Row1, hv_Column1,hv_Angle, 1, 1, 0);}hv_Number = new HTuple(hv_Row1.TupleLength());//用完清除模版HOperatorSet.ClearShapeModel(hv_ModelID);}//捕获异常catch (HalconException HDevExpDefaultException){//异常处理ho_Image.Dispose();ho_Rectangle.Dispose();ho_ImageReduced.Dispose();ho_ModelContours.Dispose();throw HDevExpDefaultException;}//处理完要内存释放ho_Image.Dispose();ho_Rectangle.Dispose();ho_ImageReduced.Dispose();ho_ModelContours.Dispose();}}//主函数#if !NO_EXPORT_APP_MAINpublic class HDevelopExportApp {static void Main(string[] args) {new HDevelopExport();}}#endif。

Halcon学习(二十五)if、switch和try

Halcon学习(二十五)if、switch和try

Halcon学习(二十五)if、switch和tryMATLAB提供三种选择结构,分别是if语句、switch语句和try 语句。

1.if语句在MATLAB中,if语句有3种格式。

(1)单分支if语句:if 条件语句组end当条件成立时,则执行语句组,执行完之后继续执行if语句的后继语句,若条件不成立,则直接执行if语句的后继语句。

(2)双分支if语句:if 条件语句组1else语句组2end当条件成立时,执行语句组1,否则执行语句组2,语句组1或语句组2执行后,再执行if语句的后继语句。

(3)多分支if语句:if 条件1语句组1elseif 条件2语句组2……elseif 条件m语句组melse语句组n多分支if语句用于实现多分支选择结构,或使用switch语句,switch语句执行效率更高。

2.switch语句switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式为:switch 表达式case 值1语句组1case 值2语句组2……case 值m语句组motherwise语句组nend当表达式的值等于值1时,执行语句组1,当表达式的值等于值2时,执行语句组2,…,当表达式的值等于值m时,执行语句组m,当表达式的值不等于case所列的表达式的值时,执行语句组n。

当任意一个分支的语句执行完后,直接执行switch语句的下一句。

otherwise是可以省略的。

当某一case条件为真并执行了匹配的语句后,余下的case语句不再执行。

switch语句的结构比if语句结构更好,使用更方便。

3.try语句语句格式为:try语句组1catch语句组2try语句先试探性执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2。

matlab中的try用法:try一般与catch连用,表示选择判断。

try(command1)组命令1总被执行,错误时跳出此结构catch(command2)仅当组命令1出现错误时组命令2才被执行endHalcon中的用法:try一般与catch连用,表示选择判断。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档