拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Halcon 程序结构

Halcon 程序结构读取/采集图像read_image/grab_image获取待处理的原始数据处理图像预处理 - 分割 - 特征提取输出结果disp_region/write_excel将判定结果显示或输出释放资源clear_image/clear_vars清理内存防止程序跑久崩溃。每次不一样的任务其实只需要调整第二步即可。场景一表面缺陷检测读取图像 → 预处理滤波去噪→ 分割动态阈值→ 特征提取connectionselect_shape→ 输出结果场景二字符识别 OCR读取图像 → 定位模板匹配find_shape_model→ 分割提取字符区域→ 识别调用do_ocr_multi_class_mlp→ 输出文本结果场景三高精度边缘测量读取图像 → 定位 → 亚像素边缘提取edges_sub_pix→ 几何拟合 → 计算距离/角度 → 输出结果图像预处理一、看“图像本身”有噪点雪花点、椒盐噪点用median_image中值滤波或gauss_filter高斯滤波光照不均匀一边亮一边暗用灰度形态学gray_tophat顶帽变换提取局部特征或者用emphasize增强局部对比度甚至用scale_image进行全局拉伸有规律的周期性纹理如布匹织纹、金属拉丝频域滤波fft_genericconvol_fft把特定频率的纹理直接抹掉目标与背景对比度太低灰蒙蒙的用emphasize锐化边缘或者scale_image增强对比度。二、看“后续任务”需要什么Blob分析 / 阈值分割做对比度增强、光照补偿确保目标和背景的灰度差足够大边缘提取 / 卡尺测量先做平滑滤波如gauss_filter把毛刺抹平然后再用emphasize把真正的物理边缘锐化形状模板匹配不需要预处理。三、看“缺陷类型”检测表面微小划痕划痕是高频信息。用emphasize或高通滤波把高频细节放大检测表面污点/色斑污点是局部灰度异常。用gray_tophat顶帽变换或者dyn_threshold动态阈值过滤掉大面积的背景只留下局部的异常点。分割1. 阈值分割threshold核心原理设定一个灰度临界值大于它的归为前景小于它的归为背景。适用场景光照均匀、对比度极高、背景单一的场景。例如文档扫描、印刷字符提取、黑白二维码分割、纯色工业零件检测。局限性一旦遇到颜色渐变、阴影或复杂纹理就会彻底失效。2. 边缘分割Edge Detection核心原理寻找物体和背景灰度突变的地方边缘然后将边缘闭合形成轮廓。适用场景简单几何工件的轮廓提取、零件尺寸检测。局限性对噪声极度敏感容易产生大量碎边缘如果物体边缘有轻微断裂就无法形成完整的轮廓。3. 区域类分割Region Growing Watershed核心原理把特征相近、空间连通的像素合并为完整区域。适用场景① 漫水填充FloodFill适合交互式的单色块提取、污渍标记。② 分水岭算法Watershed这是传统算法中的“大杀器”唯一能分割堆叠、粘连颗粒的方法例如药片计数、细胞分割、重叠的米粒。局限性分水岭算法对噪声敏感容易出现“过分割”把一个物体切成好几块且预处理流程非常复杂。4. 聚类方法Clustering核心原理用 K-Means 或 Mean-Shift 等算法根据像素的颜色、纹理相似度自动将像素分组。适用场景人像美颜预处理、纹理平滑分割、不需要先验知识的场景。局限性对高维特征处理能力弱极易受光照影响且运算耗时。参数设定一、物理约束滤波掩膜尺寸Mask Size比如中值滤波或形态学操作掩膜尺寸必须大于要去除的噪点尺寸但又要小于要保留的缺陷尺寸。形态学结构元素如果要断开两个相距 5 像素的粘连区域腐蚀算子Erosion半径就必须大于 2.5。面积筛选阈值Area在select_shape中测量 10 个正常样本找出其中最大噪点的面积然后在此基础上乘以 1.5 到 2 倍作为下限。二、统计学法动态阈值dyn_threshold的 Offset这个参数决定了灵敏度。先提取正常背景区域的灰度值计算其标准差Standard Deviation。Offset 通常设置为标准差的 2 到 3 倍这样就能在统计学上保证把正常的背景波动过滤掉只抓真正的缺陷。模板匹配的 MinScore不要盲目设为 0.8。采集 20 张良品图跑一遍匹配记录下最低的匹配分数比如是 0.75再拿几张有遮挡或光照变暗的图跑一遍看看分数掉到了多少比如 0.65。MinScore 就应该设定在这两者之间如 0.7。三、参数联动与协同法Canny 边缘检测的联动在提取亚像素边缘edges_sub_pix时如果发现边缘断断续续通常是因为 Canny 的高阈值High Threshold设得太高了。这时候不仅要降低 High Threshold还要联动降低 Low Threshold通常保持 High 是 Low 的 2 到 3 倍这样才能找回丢失的边缘。形状匹配的金字塔层级NumLevels与对比度Contrast金字塔层级越高匹配速度越快但会丢失细节。如果处理的是高反光金属件适当减少金字塔层级同时调低 MinContrast反而能大幅提高匹配的稳定性。四、边界测试法极限测试假设找到了一个完美的 Offset15。试着把它调到 10看看会不会误报调到 20看看会不会漏检。如果 12 到 18 之间都能稳定检测那么 15 就是一个极其安全的参数。鲁棒性验证把产线上光照最亮、最暗、产品位置最偏的几张“极端图”拿出来跑一遍。如果在你设定的参数下这些极端图依然能 OK参数才算真正合格。相机标定相机内参标定解决镜头畸变问题在工业现场由于镜头并非理想的光学模型拍摄出的图像往往会产生形变比如直线在边缘变弯曲了这被称为径向畸变或枕形/桶形畸变。相机内参标定的核心目的就是计算出镜头的畸变系数把弯曲的图像“拉直”从而保证后续的高精度测量不出现偏差。第一步准备标定板描述文件create_calib_data使用现成的描述算子calibrate_hand_eye_cam_plate.descr第二步采集多张标定板图像find_calib_object让相机从不同角度、不同位置、不同倾斜度拍摄标定板通常需要 10~20 张确保覆盖视野的中心和边缘。这个算子会在图像中自动寻找标定板的特征点如棋盘格的角点并将这些 3D 世界点与 2D 图像点建立对应关系。第三步执行标定计算calibrate_cameras让 Halcon 的底层算法去解算相机的内部参数。它会根据上一步提取的特征点自动计算出相机的焦距、光轴中心以及畸变系数等内参。第四步获取结果并校正图像拿到参数后就可以用来校正后续拍摄的图像了。get_calib_data提取计算出的相机内参change_radial_distortion_cam_par/gen_radial_distortion_map生成畸变校正映射map_image将原始畸变图像映射为校正后的完美图像。手眼标定解决像素到物理坐标的转换问题本质是求解一个数学转换矩阵在相机坐标系和机器人坐标系之间架起一座桥梁让机器人能够理解相机视野中目标物体的三维位置和姿态并规划出精准的抓取或操作路径。一、首先根据你的硬件安装方式选择对应的模式眼在手外相机固定安装在机器人外部的工作区域视野广阔观察机器人末端的运动。眼在手上相机安装在机器人的末端执行器法兰上随着机械手一起移动适合抓取大范围或深箱内的物体。二、数学原理手眼标定的核心是求解一个 4x4 的齐次变换矩阵。在数学上这通常被抽象为经典的AX XB方程A机器人末端执行器的运动变换矩阵基坐标系到末端坐标系。B相机观察到的目标标定板运动变换矩阵相机坐标系到目标坐标系。X待求的手眼变换矩阵相机坐标系到机器人基坐标系的转换。三、工作过程1. 硬件准备与安装根据任务需求确定安装模式Eye-in-Hand 或 Eye-to-Hand并准备好高精度的标准标定板如棋盘格或圆点阵。确保机器人底座、相机支架安装牢固且相机已进行预热暖机。2. 采集标定数据控制机器人带动标定板或相机运动到多个不同的位置和姿态。建议采集 9-12 组数据确保覆盖相机视场的主要区域避免边缘死角。每次移动后保持静止记录此时机器人末端的物理位姿同时控制相机拍摄图像并提取特征点坐标。3. 图像处理与特征提取对采集到的图像进行分析精确提取标定板上的特征点。在处理反光或复杂表面时需调整好光源和相机参数确保标定板特征点清晰可见为后续计算打下坚实基础。4. 求解手眼关系利用采集到的多组机器人位姿和图像特征数据通过专门的数学算法如 Tsai-Lenz、Kronecker 积法等进行求解计算出相机坐标系与机器人手部坐标系之间的转换矩阵。5. 精度验证与优化标定完成后必须进行验证。通过让机器人移动到由相机定位的某个目标点检验实际到达位置与理论位置的误差通常通过重投影误差或变换误差来评估。如果误差较大可通过非线性优化算法进一步减小误差。halconcreate_hand_eye_calibration (HECModelID) set_hand_eye_calibration_pose calibrate_hand_eye四、把相机看到的像素坐标精准转换为机械手能懂的物理坐标image_points_to_world_points把图像上的 2D 像素坐标 (Row, Column)结合相机的内参转换成相机坐标系下的 3D 物理坐标 (X, Y, Z)。Z 轴通常需要自己设定。create_pose把上一步算出的相机坐标系下的 (X, Y, Z) 坐标打包成一个 Halcon 专用的“位姿Pose”变量。pose_compose将两个位姿矩阵相乘。最终机械手位姿 手眼标定矩阵 (HandEyeMatrix) × 目标在相机下的位姿 (CamPose)算法性能优化一、算法与代码逻辑优化1. 限定 ROI 区域reduce_domain先用模板匹配或粗定位找到目标用reduce_domain框出关键区域后续所有算子只在这个小区域内运行。2. 模板匹配性能调优金字塔层数NumLevels高对比度目标设 3-5 层低对比度设 1-3 层。层数越多速度越快但容易丢失细节贪婪度Greediness速度要求高时调大如 0.9精度要求高时调小切记千万不要在 for 循环内创建模板create_shape_model必须在循环外执行一次循环内只调用find_shape_model。在循环内建模板是性能灾难还会导致内存泄漏。3. 组件匹配在复杂装配体检测中使用find_component_model时将搜索策略设为prune_branch。一旦发现缺失组件就提前终止搜索能将检测时间大幅缩短。二、Halcon 自动并行化AOP与多核加速Halcon 默认开启了自动操作员并行化AOP它会自动将图像数据切分给多个 CPU 核心处理。halcon* 获取当前系统核心数和线程池状态 get_system (processor_num, ProcessorNum) get_system (thread_num, ThreadNum) * 查看 AOP 是否开启默认是 true get_system (parallelize_operators, AOP)如果默认 AOP 效率不高可以使用optimize_aop算子。它会通过几小时的硬件测试为你的 CPU 生成最优的并行策略文件.aop_info以后运行程序会自动加载。三、硬件级加速GPU 提速对于极其耗时的图像处理如大尺寸图像的频域滤波、复杂的深度学习推理可以调用 GPU 加速。使用 GPU 加速前必须先关闭界面的自动刷新dev_update_off()否则图像在 CPU 和 GPU 之间频繁传输反而会拖慢速度。异常处理与工程鲁棒性一、Try-Catch 异常捕获机制防止程序崩溃的最有效手段。当 Halcon 算子遇到致命错误比如读取了不存在的图片、相机未连接时它会抛出异常Exception。如果不捕获程序就会直接停止运行。在 HDevelop 中使用try...catch...endtry将可能出错的代码包裹起来halcontry * 尝试执行可能出错的代码例如读取图像 read_image (Image, D:/images/cam_01.png) catch (Exception) * 如果出错程序不会崩溃而是跳到这里 * Exception[0] 包含了错误代码例如 5200 表示文件未找到 dev_get_exception_data (Exception, error_message, ErrMsg) disp_message (0, 捕获到异常: ErrMsg, window, 10, 10, red, true) * 在这里可以执行清理操作或跳过当前检测 endtry二、主动判断与状态机结果校验在执行find_shape_model后不要默认它找到了结果。必须判断返回的 Score 数组是否为空。如果为空说明没匹配到应主动跳过后续测量步骤超时熔断机制在高速流水线或复杂算法中如果算法陷入死循环或耗时过长会导致产线堆积。可以设置超时机制例如在 C# 中使用 Task 配合 CancellationToken或在 Halcon 中通过 timeout 参数一旦超时立即放弃当前检测进入下一节拍状态机架构工业软件绝不能写成线性的while(true)。必须采用状态机初始化 → 待机 → 触发采集 → 算法处理 → 结果输出 → 异常复位。当发生异常时程序进入“异常复位”状态等待人工干预或自动重试而不是直接崩溃。三、日志记录与质量看板记录关键信息每次检测都必须将“时间戳、图像文件名、检测结果OK/NG、耗时、错误代码”写入本地 CSV 或数据库异常图像留存当触发 catch 或检测到 NG 时自动将该图像保存到特定的 NG_Images 文件夹中。边缘检测边缘检测的实质是通过局部图像微分技术计算图像灰度分布的梯度一阶导数极值或二阶导数过零点从而提取出对象与背景间的交界线。一、传统经典的算子1. Sobel 算子特点利用像素上下左右邻域的灰度加权差分来计算梯度。优势对噪声具有平滑作用能提供较精确的边缘方向信息。劣势定位精度不高容易检测出伪边缘。2. Canny 算子工业界最常用特点被公认为最稳健的边缘检测算法之一。它包含四个严谨的步骤高斯滤波去噪、计算梯度强度和方向、非极大值抑制细化边缘、迟滞阈值化双阈值边缘跟踪。优势抗噪能力强边缘连续且精准。3. Laplacian 算子LoG特点基于二阶导数通过寻找零交叉点来定位边缘。对细节和噪声非常敏感通常需要先做高斯平滑LoG。二、Halcon 中的边缘检测1. 像素级边缘检测基础轮廓提取sobel_ampSobel 梯度算子。计算速度快对水平和垂直边缘敏感适合做简单的边缘粗提取edges_image综合梯度计算算子支持 Canny、Lanser 等算法输出梯度幅值和方向图像。2. 亚像素级边缘检测edges_sub_pix它直接输出亚像素精度的边缘轮廓XLD 格式精度可达 0.1 甚至 0.01 像素级别。支持canny、sobel、roberts等。其中 Canny 算法因为结合了高斯滤波、非极大值抑制NMS和滞后双阈值抗噪能力和边缘定位最准。halconedges_sub_pix (Image, Edges, canny, Sigma, Low, High)参数说明Sigma高斯平滑系数控制边缘检测的灵敏度。大 Sigma如 2.0~3.0检测粗边缘抗噪能力强但会丢失微小细节小 Sigma如 0.5~1.0检测细边缘但容易把噪点当成边缘。Low / High滞后双阈值过滤伪边缘连接断裂的真实边缘。High高阈值强边缘的门槛。高于此值的必定是真实边缘。Low低阈值弱边缘的门槛。低于此值的直接丢弃介于 Low 和 High 之间的如果与强边缘相连则保留否则丢弃。通常建议 High 是 Low 的 2~3 倍。如果边缘断断续续降低 Low如果背景噪点太多提高 High。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门