HALCON基于描述符的模板匹配(未标定)

前言

本篇所有内容都是未标定的!uncalib!!
也许后续会写标定的吧

突然写一篇(¦3[____]←菜的安心

写博客旨在让我自己理解和使用,并没有太深奥的理论或数学运算,纯纯的是菜狗想记录一下,等我未来看了书有了更深刻的理解再加上严谨的理论。。。。博客太臃肿了,会慢慢修改的

引出原因

在前面的学习中我已经掌握了基于形状模板的匹配,具体有三种:基于不可变形状模板的匹配shape_model,基于可缩放形状模板的匹配scaled_shape_mode,基于可形变形状模板的匹配deformable_model。

这三种按照上述顺序简单来说就是:在规定的形状里进行1:1匹配,在规定的形状里可等比例大小缩放的匹配,在规定的形状里可发生形变的匹配。当然当附加的条件越来越多,从我的在学习的实验中可以得到粗略的单很直观的感受,依次使用三种方法进行查找,所需要的时间分别为几十毫秒,几秒,十几秒甚至几十秒;从简单匹配到缩放匹配到形变匹配,每一步的计算量都有非常大的提升,计算机会花费大量的时间进行遍历匹配查找,非常非常耗时。那么当我需要耗费时间更少的模板匹配的方法,就找到了基于描述符的模板匹配~~~

算子初步展示

本篇写的所有算子都是看着HALCON的官方案例里的代码和官方文档写和翻译的,努力了解每个参数的意思,以及分析官方代码里参数的意思。

这里不需要校准的相机

create_uncalib_descriptor_model创建一个未标定的基于描述符的模板

set_descriptor_model_origin设置描述符模板的原点

get_descriptor_model_points得到描述符模板的点

find_uncalib_descriptor_model使用未标定的描述符模板进行查找

1.create_uncalib_descriptor_model算子

HALCON官方介绍文档

Name:create_uncalib_descriptor_model — Prepare a descriptor model for interest point matching.准备用于兴趣点匹配的描述符模型。

Signature:create_uncalib_descriptor_model(Template : : DetectorType, DetectorParamName, DetectorParamValue, DescriptorParamName, DescriptorParamValue, Seed : ModelID)

Description:运算符create_uncalib_descriptor_model用于准备图像区域的描述符模型,该模型可以用于基于描述符的匹配。通过随后调用find_uncalib_descriptor_model,可以获取从模板到搜索图像的投影二维变换(单应性变换)。在模板中,将模板图像中域区域的重心用作模型的原点。与create_calib_descriptor_model不同,这里不需要校准的相机,因此后续匹配的结果是一个二维投影。

描述符模型描述了一组感兴趣点。它存储它们的位置以及它们局部灰度值邻域的区分性描述。感兴趣点提取由DetectorType,DetectorParamName和DetectorParamValue进行参数化。感兴趣点周围的描述符由DescriptorParamName和DescriptorParamValue进行参数化。参数Seed用于生成随机数,在使用随机化的ferns构建描述符时使用。返回的ModelID是对生成的描述符模型的引用。可以使用此模型通过find_uncalib_descriptor_model高效地检测学习模板的实例,允许模型与搜索图像之间的透视变换。由于基于描述符的匹配依赖于稳定且有区分性的感兴趣点的存在,要检测的对象必须具有纹理,但不能是重复的。

算子的参数分析和使用详解

以下是HALCON官方文档中的create_uncalib_descriptor_model 的使用案例,对比算子的参数结构,我来一个一个分析。

create_uncalib_descriptor_model(Template : : DetectorType, DetectorParamName, DetectorParamValue, DescriptorParamName, DescriptorParamValue, Seed : ModelID)//算子结构
create_uncalib_descriptor_model (ImageReduced, 'harris_binomial', [], [], ['min_rot', 'max_rot', 'min_scale', 'max_scale'], [-90, 90, 0.2, 1.1], 42, ModelID)//实操案例

参数

Template:输入参数,图像,其区域将用于创建模型。

DetectorType:输入参数,检测的类型。
默认值: ‘lepetit’,所有种类: ‘harris’, ‘harris_binomial’, ‘lepetit’。分别表示不同类型的特征点检测器。
harris’:基于 Harris 角点检测算法,适用于较为明显的角点检测,针对低对比度的模板图像。
harris_binomial’:基于仿射不变的 Harris 角点检测算法,适用于对仿射变化敏感的角点检测,一个比较好的折中,比harris快,但是比lepetit鲁棒(稳定和强壮)。
lepetit’:基于 DoG 极值点检测和亚像素级别的精细化定位,适用于对较小的边缘特征和对比度变化较强的区域进行特征点检测,一种检测速度非常快的方法检测重要的点,但是鲁棒性不如harris。当模板或者搜索的图像很暗或者有一个很低的对比度,不要使用lepetit。

DetectorParamName,DetectorParamValue :输入参数,检测器的参数名称和值。可以通过 DetectorType 参数来设置特征点检测器的类型。
DetectorParamName默认值: [],所有值:‘alpha’, ‘check_neighbor’, ‘mask_size_grd’, ‘mask_size_smooth’, ‘min_check_neighbor_diff’, ‘min_score’, ‘radius’, ‘sigma_grad’, ‘sigma_smooth’, ‘subpix’, ‘threshold’;

‘alpha’:控制检测器得分归一化的阈值。
‘check_neighbor’:是否进行邻域像素的检查。
‘mask_size_grd’:用于计算梯度幅度的掩膜大小。
‘mask_size_smooth’:平滑图像时的掩码大小。
‘min_check_neighbor_diff’:检查邻居像素是否稳定时要使用的分数差异阈值。
‘min_score’:用于限制检测器分数的最小值。
‘radius’:用于计算关键点方向时的邻域大小。
‘sigma_grad’:用于计算梯度幅度的高斯平滑系数。
‘sigma_smooth’:用于对图像进行高斯平滑的参数。
‘subpix’:是否进行亚像素计算。
‘threshold’:控制应用于梯度幅度图像的阈值,以确定关键点。

DetectorParamValue默认值:[],建议值:0.08, 1, 1.2, 3, 15, 30, 1000, ‘on’, ‘off’, ‘none’, ‘interpolation’。

目前支持三种类型:‘lepetit’、‘harris’ 和 ‘harris_binomial’。不同类型的特征点检测器所对应的参数名称和默认值如下所示:

‘lepetit’ :[‘radius’, ‘check_neighbor’, ‘min_check_neighbor_diff’, ‘min_score’, ‘subpix’],[ 3, 1, 15, 30, ‘interpolation’];
‘harris’ :[‘sigma_grad’, ‘sigma_smooth’, ‘alpha’, ‘threshold’],[0.7, 2.0, 0.08, 1000];
‘harris_binomial’ :[‘mask_size_grd’, ‘mask_size_smooth’, ‘alpha’, ‘threshold’, ‘subpix’],[5, 15, 0.08, 1000, ‘on’];

在DetectorType中使用的是哪个类型,在DetectorParamName就使用哪种类型对应的。可以根据需要设置上述参数的值。同时,也需要注意控制检测出的特征点数量在 50 到 450 个左右,并且尽量使它们在模板图像的 ROI 上均匀分布(这取决于模板图像的纹理和大小)。可以通过可视化 gen_cross_contour_xld 函数的运行结果来检查特征点的分布情况。在大多数情况下,在保持默认参数的情况下调用特征点检测器即可。

在HALCON官方文档中这个地方是直接用了一对中括号,这代表选择不设置该参数,将其留空。当中括号 [] 被传入时,表示没有需要特别设置的特征点检测器参数,使用默认参数进行计算。如果想指定特征点检测器参数的值,可以在中括号内添加具体的参数名称和对应的值,例如 [‘radius’, ‘check_neighbor’][3,1]。

DescriptorParamName,DescriptorParamValue :输入参数,描述符的参数名称和值。提供了关于描述符模型和仿真参数的详细说明。

默认值:[],所有值:‘depth’, ‘max_rot’, ‘max_scale’, ‘min_rot’, ‘min_scale’, ‘number_ferns’, ‘patch_size’, ‘tilt’;

‘depth’:蕨的深度。深度较深的蕨可以更好地区分感兴趣点。内存需求会以 2 的 ‘depth’ 次方倍增长。典型值为 [5 … 11],默认值为 11。
‘max_rot’:Template 在法向量周围的最大旋转角度。典型值为 [0 … 180]。
‘max_scale’:Template 的最大缩放比例。典型值为 [1.0 … 3.5]。
‘min_rot’:Template 在法向量周围的最小旋转角度。典型值为 [-180 … 0]。
‘min_scale’:Template 的最小缩放比例。典型值为 [0.1 … 1.0]。
‘number_ferns’:使用的蕨结构数量。使用更多的蕨可以增加识别的鲁棒性,但也会增加匹配的运行时间。如果描述符所需的内存较小,则可以使用许多深度较小的 fern(例如,‘number_ferns’=150,‘depth’=5)。如果检测速度更重要,则可以使用较少但深度较大的 fern(例如,‘number_ferns’=10,‘depth’=11)。典型值为 [1 … 150]。
‘patch_size’:描述感兴趣点的正方形邻域的边长。过大的值可能会影响运行时间。典型值为 [15 … 33]。
上面这三个变量,透明地控制检测的鲁棒性、速度和内存消耗。
‘tilt’:在模拟阶段开启或关闭投影变换。开启后,模型的鲁棒性提高,可以找到更大倾斜角度的对象。关闭后,可以显著减少训练时间,模型仍然能够识别具有投影不变性的对象。可能的值为 [‘on’, ‘off’],默认值为 ‘on’。

默认值: [],建议值: 0.5, 1.4, 11, 21, 30, -180, 180, ‘on’, ‘off’。

在计算机视觉和图像处理领域,描述符模型用于描述图像的局部特征和特征点,而仿真参数则用于控制模型的训练和匹配过程。
描述符大小参数包括 ‘depth’、‘number_ferns’ 和 ‘patch_size’,它们分别控制描述符的深度、蕨结构数量和邻域大小。这些参数可以透明地控制检测的鲁棒性、速度和内存消耗

仿真参数包括 ‘tilt’、‘min_rot’、‘max_rot’、‘min_scale’ 和 ‘max_scale’,它们用于控制模型的仿真过程,包括投影变换、旋转角度和尺度范围。设置这些参数可以影响模型的训练时间、匹配结果和对仿真对象的适应能力

这些参数允许用户根据具体的应用需求来调整描述符模型和仿真过程,以达到最佳的检测和匹配效果。这些参数的选择需要谨慎,因为它们直接影响描述符模型的性能和匹配结果。
在HALCON官方文档中这个地方是只控制了仿真参数的最大最小旋转角度和最大最小缩放值。

seed:参数 Seed 用作模型的标识符(ModelID),以便在后续的操作中对该模型进行引用和处理。
这里的 “seed” 并非随机数的种子,而是用来标识所创建的模型的唯一标识符。通过使用不同的种子,可以创建不同的模型实例并在后续处理中加以区分。

ModelID:输出参数,描述符模型的句柄。

最后附上HALCON中运行监视ModelD能看到的参数的值。

HALCON中可视化监视变量


这里能看到在HALCON官方文档给的案例中手动输入修改的参数值,-90,90,0.2,1.1。
这里注意到,这个Row和Column从哪里来!这两个0.0是什么啊,怎么哪里都看不到呀ヽ(#`Д´)ノ,这个要在下一个目录内容set_descriptor_model_origin能知道从哪里来的了。

2.set_descriptor_model_origin算子

HALCON官方介绍文档

Name:set_descriptor_model_origin — Sets the origin of a descriptor model.设置描述符模型的起始点。

Signature:set_descriptor_model_origin( : : ModelID, Row, Column : )

Description:操作符 set_descriptor_model_origin 将描述符模型 ModelID 的原点(参考点)设置为新值。原点是相对于用于使用 create_uncalib_descriptor_model 或 create_calib_descriptor_model 创建描述符模型的图像域(区域)的重心来指定的。因此,原点为 (0,0) 意味着该模型图像域的重心被用作原点。原点为 (-20,-40) 意味着原点位于重心的左上方。新的设置会影响随后的 find_uncalib_descriptor_model 和 find_calib_descriptor_model 调用。

算子的参数分析和使用详解

以下是HALCON官方文档中的set_descriptor_model_origin的使用案例,对比算子的参数结构。

set_descriptor_model_origin( : : ModelID, Row, Column : )//算子结构
set_descriptor_model_origin (ModelID, -Height / 2, -Width / 2)//实操案例

参数

ModelID:输入参数,描述符模型的句柄。主要是作为上一步create后得到的句柄

Row, Column:输入参数,该模型图像域的原点。设置描述符模型图像域的原点是为了定义模型在图像中的参考位置。原点的选择可以根据特定需求来确定,将原点设置在模型图像域的中心重心可以在一定程度上简化模型的定位操作。而将原点设置在重心的左上方或任何其他位置,则可以根据具体场景和需求进行精确的位置定位。设置模型图像域的原点,可以更好地控制和管理描述符模型的位置信息。
在这里插入图片描述

3.get_descriptor_model_points算子

HALCON官方介绍文档

Name:get_descriptor_model_points — Query the interest points of the descriptor model or the last processed search image.查询描述符模型或最后处理的搜索图像的兴趣点。

Signature:get_descriptor_model_points( : : ModelID, Set, Subset : Row, Column)

Description:使用操作符 get_descriptor_model_points 可以查询描述符模型或上次处理的搜索图像中的兴趣点。其中,需要提供一个由 create_uncalib_descriptor_model、create_calib_descriptor_model 或 read_descriptor_model 返回的 ModelID 参数。存储在模型中的兴趣点可以通过将 Set 参数设置为“model”,Subset 参数设置为“all”来查询。如果先进行了 find_uncalib_descriptor_model 或 find_calib_descriptor_model 操作,则可以通过将 Set 设置为“search”,Subset 设置为“all”来查询上次搜索图像中的兴趣点。此外,还可以查询每个找到的对象实例的匹配(对应)点,方法是将 Set 设置为“model”或“search”(分别对应模型或搜索图像侧的对应点),并将 Subset 设置为实例的结果号。查询得到的兴趣点的图像坐标将以 Row 和 Column 形式返回。

算子的参数分析和使用详解

以下是HALCON官方文档中的get_descriptor_model_points的使用案例,对比算子的参数结构。

get_descriptor_model_points( : : ModelID, Set, Subset : Row, Column)//算子结构
get_descriptor_model_points (ModelID, 'model', 'all', Row_D, Col_D)//实操案例

参数

ModelID:输入参数,描述符匹配模型句柄。

Set:输入参数,Set of interest points.
默认值: ‘model’;所有值类型 ‘model’, ‘search’
‘model’:感兴趣点集合是基于模型图像的,感兴趣点仅在模型图像上提取和使用。
‘search’:感兴趣点集合是基于搜索图像的,在这种情况下,感兴趣点将在搜索图像上提取和使用,而不是模型图像。

Subset:输入参数,感兴趣点的子集。
默认值: ‘all’;建议值: ‘all’, 0, 1, 2

Row:输出参数,感兴趣点的行坐标。

Column:输出参数,感兴趣点的列坐标。

HALCON中可视化监视变量

在这里插入图片描述

4.find_uncalib_descriptor_model算子

HALCON官方介绍文档

Name:find_uncalib_descriptor_model — Find the best matches of a descriptor model in an image.在图像中查找描述符模型的最佳匹配项

Signature:find_uncalib_descriptor_model(Image : : ModelID, DetectorParamName, DetectorParamValue, DescriptorParamName, DescriptorParamValue, MinScore, NumMatches, ScoreType : HomMat2D, Score)

Description:操作符find_uncalib_descriptor_model在Image中查找描述符模型ModelID的最佳匹配。描述符模型必须是以前通过调用create_uncalib_descriptor_model、create_calib_descriptor_mode或read_descriptor_model创建的。
只有当分数超过MinScore值时,才接受匹配。该标准基于“inlier_ratio”分数,下文将对此进行详细描述。每个匹配的运算符find_uncalib_descriptor_model的主要结果是3x3矩阵HomMat2D,它描述了模型点到搜索图像点的2D投影,并由按行主要顺序的9个元素的元组表示。如果搜索到的对象(模板)出现更多匹配并通过MinScore标准,则将连接得到的多个单应性。实际找到的对象数等于NumObjects=|HomMat2D|/9。
检测过程分为三个部分。首先,从搜索图像中提取兴趣点(仅在搜索图像的域内)。这是使用在模型生成期间选择一次的点检测器及其参数来完成的。但是,DetectorParamName和DetectorParamValue可用于在find_uncalib_descriptor_model调用期间指定不同的检测器参数值。通过改变这些参数,可以根据模型生成和在线检测之间的照明变化进行调整。但是,建议使用与创建模型相同的值(传递一个空元组)。

算子的参数分析和使用详解

以下是HALCON官方文档中的find_uncalib_descriptor_model 的使用案例,对比算子的参数结构。

find_uncalib_descriptor_model(Image : : ModelID, DetectorParamName, DetectorParamValue, DescriptorParamName, DescriptorParamValue, MinScore, NumMatches, ScoreType : HomMat2D, Score)//参数结构
find_uncalib_descriptor_model (ImageGray, ModelIDs[Index2], 'threshold', 600, ['min_score_descr', 'guided_matching'], [0.003, 'on'], 0.25, 1, 'num_points', HomMat2D, Score)//实操案例

参数

Image:输入参数,应在其中查找模型。

ModelID:输入参数,描述符匹配模型句柄。

DetectorParamName,DetectorParamValue:输入参数,与create中一样。

DescriptorParamName,DescriptorParamValue:输入参数,描述符的参数名称。
默认值:[],列表:‘min_score_descr’,‘guided_matching’;
‘min_score_descr’:最小分数描述符,用于控制特征匹配的数量。
‘guided_matching’:引导匹配,增强特征匹配的精度和鲁棒性,默认值为 False,可以通过设置为 True 来开启引导匹配。

默认值:[],建议值:0.0, 0.001, 0.005, 0.01, ‘on’, ‘off’。

MinScore:输入参数,要查找的模型实例的最小分数。
默认值:0.2,建议值:0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0。

NumMatches:输入参数,查找到的实例的最大数量。
默认值:1,建议值:1, 2, 3, 4。

ScoreType:输入参数,在得分中要评估的得分类型。
默认值:‘num_points’,列表:‘inlier_ratio’, ‘num_points’。
‘inlier_ratio’:内点比例,指匹配正确的数据点占总点数的比例。
‘num_points’:点数,指匹配正确的数据点的数量。

HomMat2D:输出参数,矩阵,这个矩阵是从create中的训练图像到find中的查找图像中所找到的模型的透射变换的变换矩阵。

Score:输出参数,根据ScoreType输入计算出来的找到实例的分数

HALCON中可视化监视变量

在这里插入图片描述

最后附上HALCON官方案例的代码

* This example finds pages of articles in a picture database.
* In the first step different pages are trained and models are created.
* Afterwards unknown images are searched and the correct article
* pages are detected.
* Please notice that this example needs some memory to train the models.
* 
dev_update_off ()
dev_close_window ()
read_image (Image, 'brochure/brochure_page_01')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_display (Image)
* 
* Clear all already created descriptor models.
ModelIDs := []
ModelsFound := 0
NumPoints := []
NumModels := 3
TotalTime := 0
* 
* Create region for visualization purpose.
RowRoi := [10, 10,Height - 10,Height - 10]
ColRoi := [10,Width - 10,Width - 10,10]
gen_rectangle1 (Rectangle, 10, 10, Height - 10, Width - 10)
disp_message (WindowHandle, ['Press \'Run\' to start model creation ...', '(may take a few minutes)'], 'window', 10, 10, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* For every page the descriptor model is created.
for Index := 1 to NumModels by 1
    read_image (Image, 'brochure/brochure_page_' + Index$'.2')
    rgb1_to_gray (Image, ImageGray)
    get_image_size (ImageGray, Width, Height)
    reduce_domain (ImageGray, Rectangle, ImageReduced)
    dev_clear_window ()
    dev_display (ImageGray)
    disp_message (WindowHandle, 'Creating model no. ' + Index + '/' + NumModels + ' ... please wait.', 'window', 10, 10, 'black', 'true')
    * 
    * Create the descriptor model with default parameters (except scaling)
    * For a fast detection, the harris binomial point detector is chosen.
    count_seconds (Seconds1)
    create_uncalib_descriptor_model (ImageReduced, 'harris_binomial', [], [], ['min_rot', 'max_rot', 'min_scale', 'max_scale'], [-90, 90, 0.2, 1.1], 42, ModelID)
    count_seconds (Seconds2)
    TotalTime := TotalTime + (Seconds2 - Seconds1)
    * 
    * For the correct projection of the rectangles in a later step the origin
    *   of the model has to be set to the image origin
    set_descriptor_model_origin (ModelID, -Height / 2, -Width / 2)
    ModelIDs := [ModelIDs,ModelID]
    * 
    * Store the points which are extracted from the model for later matching.
    get_descriptor_model_points (ModelID, 'model', 'all', Row_D, Col_D)
    NumPoints := [NumPoints,|Row_D|]
endfor
* 
* Model creation finished.
dev_display (ImageGray)
disp_message (WindowHandle, NumModels + ' models created in ' + TotalTime$'.4' + ' seconds.', 'window', 10, 10, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Initialize the window again, because the image size has changed.
read_image (Image, 'brochure/brochure_01')
dev_resize_window_fit_image (Image, 0, 0, -1, -1)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
* 
* Main loop:
* Search the models in all images
for Index1 := 1 to 12 by 1
    OutputString := []
    NumMsgs := 0
    ModelsFound := 0
    TotalTime := 0
    read_image (Image, 'brochure/brochure_' + Index1$'.2')
    rgb1_to_gray (Image, ImageGray)
    dev_display (Image)
    disp_message (WindowHandle, 'Searching image ...', 'window', 10, 10, 'black', 'true')
    * 
    * Search every model in each image
    for Index2 := 0 to |ModelIDs| - 1 by 1
        * 
        * Find model (using default parameters)
        count_seconds (Seconds1)
        find_uncalib_descriptor_model (ImageGray, ModelIDs[Index2], 'threshold', 600, ['min_score_descr', 'guided_matching'], [0.003, 'on'], 0.25, 1, 'num_points', HomMat2D, Score)
        count_seconds (Seconds2)
        Time := Seconds2 - Seconds1
        TotalTime := TotalTime + Time
        * 
        * Check if the found instance is to be considered as a possible right match
        * depending on the number of points which were considered
        if ((|HomMat2D| > 0) and (Score > NumPoints[Index2] / 4))
            get_descriptor_model_points (ModelIDs[Index2], 'search', 0, Row, Col)
            gen_cross_contour_xld (Cross, Row, Col, 6, 0.785398)
            * 
            * Project the ROI rectangle and points
            projective_trans_region (Rectangle, TransRegion, HomMat2D, 'bilinear')
            projective_trans_pixel (HomMat2D, RowRoi, ColRoi, RowTrans, ColTrans)
            angle_ll (RowTrans[2], ColTrans[2], RowTrans[1], ColTrans[1], RowTrans[1], ColTrans[1], RowTrans[0], ColTrans[0], Angle)
            Angle := deg(Angle)
            * 
            * Check if the projected rectangle is to be considered as a right match
            * depending on the angle in the right upper edge.
            if (Angle > 70 and Angle < 110)
                area_center (TransRegion, Area, Row, Column)
                ModelsFound := ModelsFound + 1
                dev_set_color ('green')
                dev_set_line_width (4)
                dev_display (TransRegion)
                dev_set_colored (12)
                dev_set_line_width (1)
                dev_display (Cross)
                disp_message (WindowHandle, 'Page ' + (Index2 + 1), 'window', Row, Column, 'black', 'true')
                OutputString := [OutputString,'Page ' + (Index2 + 1) + ' found in ' + (Time * 1000)$'.4' + ' ms\n']
            endif
        endif
    endfor
    if (ModelsFound == 0)
        OutputString := 'No model found'
    endif
    NumMsgs := NumMsgs + 1
    OutputString := ['Search time over all pages: ' + (TotalTime * 1000)$'.4' + ' ms',OutputString]
    disp_message (WindowHandle, OutputString, 'window', 10, 10, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
endfor
dev_display (ImageGray)
disp_message (WindowHandle, 'Program finished.\nPress \'Run\' to clear all descriptor models.', 'window', 10, 10, 'black', 'true')

HALCON案例的匹配结果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值