一、代码的主要思路为:
这个例程展示了如何使用形状模型(Generic Shape Model)在含有高噪声的图像中进行对象检测。代码分为几个主要部分,包括模型的创建、训练、参数设置、搜索参数配置以及在线搜索过程。以下是详细的步骤和功能解释:
初始化与环境设置
- 关闭并重新初始化设备(窗口)。
- 读取一个示例图像
crosses_01
用于后续展示和说明。 - 设置显示窗口的字体、颜色和线宽,为可视化做准备。
- 显示图像描述信息和样本图像,暂停程序让用户查看。
创建形状模型(离线步骤)
- 使用
create_generic_shape_model
创建一个形状模型对象。
定义模型模板(离线步骤)
- 读取一个定义好的模型轮廓(
ModelContour
),这是模型匹配的基础。
设置模型参数(离线步骤)
- 调整尺度不变性参数(最小和最大比例),以适应不同大小的对象。
训练形状模型(离线步骤)
- 使用
train_generic_shape_model
根据提供的轮廓训练模型。
设置匹配度量(离线步骤)
- 创建一个极性图像(PolarityImage)以辅助匹配,通过填充区域并根据轮廓反转部分区域的像素值。
- 根据匹配结果计算单应性矩阵,并设置模型匹配度量,使用极性图像增强匹配效果。
估计最低金字塔级别(离线步骤)
- 针对高噪声情况,使用一个样本搜索图像来自动估计搜索时应使用的最低金字塔级别,这有助于在噪声较大的情况下仍能有效匹配。
设置搜索参数(在线/离线均可)
- 限制旋转角度范围、设置最大匹配数、允许的最大重叠以及贪婪度等,以优化搜索性能和结果质量。贪婪度设置为0意味着尽可能全面的搜索,不急于收敛。
在图像中查找模型(在线步骤)
- 循环读取一系列测试图像(
crosses_02
至crosses_11
),在每张图像中使用训练好的模型进行匹配。 - 对于每次匹配,获取所有匹配结果的轮廓,并在原图像上显示这些轮廓,同时提供匹配结果的文本说明。
- 每处理完一张图片后,暂停一段时间以便观察。
清理与结束
- 清空显示窗口,显示结束信息,重新开启设备更新,完成程序。
二、具体代码注释如下
*
* ***********************************************************
* This example shows how to use the 'high_noise_sample' *
* parameter from the set_generic_shape_model_object *
* operator to improve the matching rate for images *
* containing very high noise. The operator estimates the *
* lowest pyramid level automatically based on a provided *
* sample search image.
*查找图像中一个或多个形状模型的最佳匹配此示例演示如何使用“high_noise_sample”
*参数 from the set_generic_shape_model_object
*运算符,以提高图像的匹配率
*包含非常高的噪音。运算符估计
*最低金字塔级别自动基于提供的
*示例搜索图像。 *
* ***********************************************************
*
* Initialization.
dev_update_off ()
dev_close_window ()
*
* Initialization of the display window using automatic size.
read_image (Image, 'crosses/crosses_01')
*打开一个新的图形窗口,以保留给定图像的纵横比。
dev_open_window_fit_image (Image, 0, 0, 640, 640, WindowHandle)
*设置窗口的字体大小为14,格式为'mono',加粗,不倾斜
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*设置输出颜色
dev_set_color ('lime green')
*设置轮廓边缘的宽度
dev_set_line_width (3)
*
* Visualization.
*显示描述文本
dev_display_description_text (WindowHandle)
stop ()
*显示例程图片
dev_display_sample_image (Image, WindowHandle)
stop ()
*
* ***********************************************************
* Create the shape model (offline step) *
*创建形状模型(离线步骤)
* ***********************************************************
* 创建未被训练模型的句柄
create_generic_shape_model (ModelID)
*
* ***********************************************************
* Define the model template (offline step) *
*定义模型模板
* ***********************************************************
*
* The quality of the model contour is crucial.
*模型轮廓的质量至关重要
*从model_contour中读取ModelContour(模型轮廓)标志性对象
read_object (ModelContour, 'model_contour')
*