工业视觉上位机开发里最容易被误解的一句话,是“用Halcon做个检测软件就行”。不少零基础转行上位机的朋友,先学了一堆Halcon算子,模板匹配、划痕检测、缺陷检测,真到了工控现场却发现:相机连不上,按钮点一下没反应,检测结果不知道怎么发给PLC。实际上,Halcon解决的是机器视觉里的图像处理能力问题,它不等于上位机;真正要交付的是一套能长期稳定运行在工控机上的业务程序,负责触发采集、图像预处理、结果显示、数据上传和异常兜底。这篇内容以Halcon相机采集和图像预处理为主线,把上位机集成时最关键的环境、步骤、参数和排查顺序完整拆开,适合刚接触机器视觉上位机,或者准备转行做上位机开发的人读。
1. 工业视觉项目里,上位机和Halcon到底各管哪一段
1.1 上位机不等于机器视觉,更不等于Halcon
很多培训机构为了讲起来方便,会把“上位机”和“机器视觉”混在一起说。实际项目里,上位机是运行在PC或工控机上的应用程序,核心职责是业务流程:
- 接收PLC、扫码枪、按钮或MES系统的触发信号。
- 控制相机拍照,或读取已保存的图像。
- 调用图像处理算法,得到位置、角度、OK/NG、坐标等结果。
- 把结果显示到界面上,并写数据库、日志或发给PLC。
- 处理异常,比如相机断线、超时、模型文件丢失、磁盘空间不足。
而Halcon只是这套流程里的“图像处理能力提供方”,负责图像采集接口、图像预处理、模板匹配、测量、缺陷识别。它不是界面框架,不是通信中间件,也不是数据库。很多零基础的人学完Halcon算子后不会做上位机,不是因为算子没学会,而是因为脑子里没有“业务流程”这条主线。
机器视觉项目更是一个完整系统:视觉软件负责“看”,上位机负责“怎么用看到的结果”,PLC和机械结构负责“动起来”。Halcon、VisionMaster这类软件解决的是“看”的部分,但它们不能替代整台设备的调度逻辑。想转行上位机,首先要把这个边界想清楚。
1.2 C#上位机、Qt上位机和视觉软件如何选
网络热词里经常出现C#上位机、QT上位机、LabVIEW上位机、MFC Modbus通信、海康VisionMaster通讯方案。这些技术不是互相替换的关系,而是使用场景不同。
| 开发方式 | 适合场景 | 和Halcon配合方式 |
|---|---|---|
| C# WinForms/WPF | Windows工控机为主,开发快,串口、Modbus、TCP例程多 | 引用HalconDotNet,直接调用HImage和HOperatorSet |
| Qt C++上位机 | 需要跨平台、界面更复杂、性能要求更高 | 通过Halcon C++接口或外部进程调用 |
| LabVIEW | 测试设备、采集卡、仪表控制类项目 | 通过Halcon扩展或调用DLL,但调试链略重 |
| 海康VisionMaster独立运行 | 不想写太多底层,用可视化流程搭建视觉方案 | 跟上位机用TCP/IP、Modbus TCP、共享文件或SDK通讯 |
给新手的建议很直接:如果不是公司技术栈锁定,优先学“C# + Halcon”这条路线。原因是Windows工控领域资料最多,相机SDK、PLC通信库、Halcon的.NET封装都有现成方案,遇到问题更容易搜到解决思路。
你可能会在热搜里看到“MFC上位机Modbus通信”“LabVIEW实现Bootloader上位机”,这些属于特定行业的历史方案。如果目标是快速做成一个机器视觉上位机,不必一上来就陷进MFC或者LabVIEW的细节里。等真正进了项目,再按公司现有框架补。
1.3 先用一条项目链路判断自己缺什么
不要只盯着Halcon算子。先拿一个完整视觉项目来对照:
- 相机拍一张产品图像。
- Halcon从图像里找出待检测区域。
- 预处理后判断OK或者NG。
- 上位机界面显示图像和结果,同时把结果写入本地日志。
- OK时继续下一张,NG时弹出提示或向PLC发送信号。
这套链路里,你要同时具备四块技能:相机采集、图像处理、界面显示、通信和异常处理。很多人学了Halcon却做不出项目,主要是缺了第一块和最后一块。
如果你只是零基础转行,建议先把链路缩短成“按钮触发一次采集,显示到界面并保存图像”。只要这个闭环能稳定跑通,后续加模板匹配、加通信协议都会顺利很多。相反,一上来就做多相机、高速检测、深度学习缺陷分类,只会让自己卡在环境问题上。
2. 环境搭建:先把Halcon和相机采集跑通,再谈图像预处理
2.1 授权、版本、位数和DLL依赖要一起检查
Halcon和普通开源库不一样,它需要授权。安装包和试用许可的获取方式,要认准官方渠道,不要用网上下载的破解授权或来路不明的密钥。商业项目上更容易出问题的不是“算法不会”,而是“授权不合规导致工厂机器突然不能运行”。
安装完成之后,第一个检查点是版本。Halcon版本号很多,比如18.11、20.11、23.05这类形式,不同版本之间算子差异不大,但运行库、深度学习模型格式、相机接口支持范围会有区别。如果你看到一些“Halcon 2025 DLL”的说法,不要急着下载别人封装好的DLL,正确做法是去官方安装目录下找你当前版本自带的文件。版本不确定时,以自己项目实际安装版本为准。
开发上位机程序时,还要检查这几点:
- 项目目标平台是x64还是x86。现在多数相机SDK和Halcon运行时都建议用x64,如果你建的是x86项目,加载DLL时很容易报“未能加载文件或程序集”。
- HalconDotNet.dll是否被正确引用。引用之后,通常还要保证程序输出目录里能找到它。最简单的方式是把相关DLL设为“复制本地”,或者在部署目录里放齐运行时文件。
- 摄像头SDK和Halcon是否都使用的是中文路径。不要在路径里带空格和中文,虽然有些环境能撑住,但排错时容易让人误判。
我发现很多启动失败都发生在项目引用阶段。比如界面能打开,一调用Halcon就报错,这时先看是不是引用了错误的DLL副本,而不是怀疑算法流程写错。
2.2 GigE相机和USB相机都要先做“裸相机”验证
不管你用的是海康、大华、Basler还是其他品牌的工业相机,第一原则都是:先用相机厂商自己的软件打开相机,再做Halcon采集。如果厂商软件都连不上,Halcon这边一定连不上。
GigE网口相机需要特别注意:
- 相机IP和电脑网卡IP要在同一网段。
- 关闭Windows防火墙,或在防火墙里放行相机发现协议和采集端口。
- 网卡巨型帧需要开启,如果驱动设置里没有这个选项,尝试更新网卡驱动。
- 笔记本用无线网卡做GigE视觉采集基本不稳定,尽量用有线网卡。
USB3相机相对简单,但要确认电脑的USB口是USB3.0,插到2.0口上通常会提示带宽不足或图像传输不稳定。相机数据线不要随意延长,也不要用普通手机数据线代替。
这些环境下最容易犯的错,是一开始就用Halcon代码去试相机。遇到“相机打不开”时,多数情况是驱动、IP、带宽或权限问题,不是Halcon算子参数问题。先打开厂商软件,能连续实时预览画面,再进Halcon做采集。
2.3 最小可运行的程序结构要包含“释放”
写Halcon上位机程序时,建议先做一个最小工程:一个按钮、一个图像显示控件、一个日志文本框。按钮点击后,完成下面这些步骤:
- 打开相机采集句柄。
- 抓取一帧图像。
- 把图像显示到界面。
- 关闭相机采集句柄。
不要在这个阶段加入模板匹配、测量、深度学习推理。先用最干净的结构验证“从相机到内存再到界面”的整条链路。
下面是HDevelop里的示意,实际参数要以你的Halcon版本和相机接口帮助页为准:
* 示意:GigEVision接口打开并抓取一帧 open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 0, -1, AcqHandle) grab_image (Image, AcqHandle) close_framegrabber (AcqHandle)这段代码虽然简单,但包含了关键动作:创建采集句柄、抓图、释放句柄。真实上位机里,采集句柄往往在窗体加载时打开,在窗体关闭时释放,而不是每次拍照都重新创建一次。频繁开关采集句柄会让相机响应变慢,甚至出现设备占用失败。
3. 相机采集的难点不是算子,而是稳定拿到一帧可处理图像
3.1 Halcon采集流程的关键参数要按现场环境调
很多教程喜欢直接贴open_framegrabber,却不说参数含义。实际调试时,关键参数主要是:
- 相机类型和设备号:多相机时容易混淆,GigE相机通常通过IP或MAC区分。
- 色彩空间:彩色相机输出可以设置成RGB,也可以让Halcon转成灰度。
- 图像宽高:如果采集出来是HALCON报错或者黑屏,先看相机当前设定分辨率是否符合算子里的默认值。
- 触发方式:有连续采集、软触发、硬触发。做视觉定位时常用硬触发,但调试阶段先用连续模式看画面。
真实项目中,第一次采集往往不追求速度,而是先把曝光、增益、触发模式、图像格式固定下来。曝光太大会导致运动模糊,增益太大会导致噪声增多。Halcon负责的是拿到这张图之后的事,但前端的曝光和采图参数会直接影响预处理难度。
我一般会这样调试:先用厂商软件查看当前图像正常不正常,然后用Halcon连续抓几帧,看有没有花屏、横纹、亮度跳变。如果前端图像本身有问题,后面所有预处理都是在处理垃圾数据。
3.2 如果相机不走Halcon接口,怎么把裸数据转成HImage
有些项目不使用Halcon的GigEVision、USB3Vision或GenICam接口,而是用相机厂家的SDK取图。比如你接到一个任务,甲方指定用海康SDK或厂商私有SDK抓图,再使用Halcon做处理。这时不能直接在Halcon里打开相机,而是要把SDK拿到的内存图像转成Halcon图像。
转换逻辑通常是这样的:
- 从相机SDK中得到数据指针、图像宽高、像素格式。
- 常见灰度格式是8位或16位单通道。
- 彩色格式有RGB、BGR、RGGB等排列,不能直接用错。
- Halcon里可用
gen_image1按单通道生成,用gen_image_interleaved按连续排列生成,或者用gen_image3生成三通道图像。
这类转换最容易错的是像素格式对应关系。比如SDK里标着YUV格式,你当成RGB传给Halcon,图像颜色就会偏;标着BGR,你当RGB用,红蓝通道会反。线上调试时如果发现颜色不对,不要怀疑算法,先检查通道排列。
从相机SDK到Halcon这一步,是上位机开发和纯算法学习差异最大的地方。纯学Halcon的人基本不会碰这些,因为HDevelop里打开目录图片太简单了。到了上位机环境,你要自己处理内存和字节对齐问题,这也是为什么建议先学“一个采集按钮”的完整程序。
3.3 单相机稳定后,再考虑断线重连和多相机
单相机单任务都跑通之后,下面两个扩展才值得做。
第一个是断线重连。工业相机在长时间运行后可能因为网线松动、主机休眠、带宽冲突导致掉线。Halcon代码不是只写“打开相机、抓图、关闭”就够了,还需要增加状态检测和重试机制。常见做法是:采集线程里检测耗时,如果超过设定超时时间就判定异常,然后释放句柄,重新初始化相机。
第二个是多相机。多相机不代表开多个界面线程。真实做法是把每台相机的采集任务放到独立线程里,每个线程维护自己的采集句柄,然后用共享队列把图像交给处理线程。
这里要特别注意:不要在UI线程里直接循环抓图。画面上看是卡顿,时间一长相机缓存堆积,图像延迟越来越大,产线就会误判。正确顺序是先让相机回调或独立线程去抓图,再把图像塞到队列,处理完再更新界面。
4. 图像预处理:先稳定特征,再谈滤波和阈值
4.1 不要为了“好看”而预处理
图像预处理是工业视觉项目里最影响算法稳定性的一步。但它不是为了把图像变清晰、变亮,而是为了让后面的定位、测量、识别更稳定。
工业现场遇到的问题通常有几种:
- 环境光变化,同一种产品在不同时间段拍出来亮度不一样。
- 反光、阴影、油污、灰尘干扰。
- 相机噪声和采样噪声。
- 产品本身表面纹理复杂,目标特征容易被背景淹没。
如果你的算法在实验室里很准,到了现场却经常误判,大概率是预处理只适应了那几张样例图,没有考虑光照和噪声波动。更稳妥的思路是给整个图像链路固定前端条件,再做预处理。
比如产品反光强,先把光源和曝光调到一个稳定区间,比写一个非常复杂的滤波算子更有效。预处理解决的是残余波动,不是替你挽救糟糕的成像质量。
4.2 一条典型的预处理链路怎么搭
给新手的建议是记通用链路,不要只记孤立算子。常见的顺序是:彩色转灰度、去噪、提高对比度、分割、区域过滤。
* 示意:常见图像预处理链路 rgb1_to_gray (ColorImage, GrayImage) median_image (GrayImage, MedianImage, 'circle', 3, 'mirrored') scale_image_max (MedianImage, ScaledImage) threshold (ScaledImage, Regions, 60, 180) connection (Regions, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 300, 10000)这段代码里每一步都有目的:
rgb1_to_gray把彩色图转成灰度,减少通道干扰。median_image去除椒盐噪声,用圆形掩膜,半径3是常见起点。scale_image_max把灰度范围拉开,让目标区域和背景更容易分开。threshold通过固定灰度范围选出目标区域。connection把不相连的区域拆开。select_shape按面积等特征过滤掉小块噪声。
需要明确的是,这不是万能模板。threshold的固定阈值受光照影响很大,如果产线光照会波动,最好改用动态阈值、局部阈值,或者在预处理前做背景校正。如果产品本身纹理复杂,单靠灰度阈值不够,还要加纹理分析或深度学习分类。
参数上没有固定的“最优值”,判断标准是:连续跑几十张不同类型图像,结果不能忽好忽坏。一个参数能让你这张图漂亮并不重要,重要的是换一批图仍然稳定。
4.3 划痕这类目标为什么不能只用全局阈值
热搜里大家经常搜“Halcon划痕检测”。划痕类检测项目是最典型的“预处理决定成败”场景。
划痕在图像上的表现往往是局部灰度异常,但正常产品表面也可能有纹理、灰尘和反光。如果只做一个全局阈值,会把所有灰度变化都选出来,结果不是漏检就是误检。比较常见的思路是:
- 先做背景抑制,把均匀背景去掉,保留异常区域。
- 用滤波或形态学操作突出划痕的连续性。
- 通过区域面积、长宽比或轮廓特征筛选出真正的划痕。
- 如果划痕和纹理太像,再考虑模板对比或深度学习方法。
这种项目不能只看单张图调参。最好的办法是找一个能模拟产线光照的样本集,把OK和NG图都放进去跑,再通过预处理算子的中间输出判断算法到底是用什么特征做区分。
如果后续还用到“Halcon深度学习工具”,也要注意一点:深度学习模型的训练和推理,最好使用和训练时一致的预处理方式。推理阶段临时改了滤波参数,相当于改变样本分布,模型效果很容易下降。
4.4 中间结果一定要落盘保存
调试图像处理时,最忌讳只靠最终结果判断。你想知道算法为什么把某个区域误判成缺陷,但界面只显示一个NG,中间图全没留,会很难排查。
一般建议在关键节点保存中间图:
write_image (ProcessedImage, 'tiff', 0, 'D:/work/output/img_001.tiff')保存图像时经常遇到的问题,不是算子写错,而是路径和格式问题。比如路径里用了反斜杠,Windows下有时也能识别,但更稳妥的是统一写D:/work/output/这种形式;指定的目录不存在,或者当前用户没有写权限,也会导致保存失败;tiff格式要确保Halcon支持该编码。
write_image保存失败时,先确认三件事:目录可写、文件名不带非法符号、文件格式参数和扩展名对应。不要一遇到保存失败就怀疑是图片对象的问题。通常把路径改成英文目录、确认文件夹存在,问题就解决了。
5. 把Halcon放进上位机UI后,性能逻辑完全不一样
5.1 显示图像不是简单调用一个算子
在WinForms或WPF里显示Halcon图像,常用的是HWindowControl或HSmartWindowControl。把图像显示到控件上的代码看起来很短,比如获得Halcon窗口后调用DispObj,但真正要处理好的是对象生命周期。
Halcon图像是底层对象,不是托管内存。用完后需要释放,否则长时间运行会占用大量内存。如果图像对象正在UI控件里显示,又被另一个线程释放,界面就可能在刷新时崩溃。
C#上位机里常用的做法是:算法线程处理完图像,把结果对象交给UI线程显示。显示完成后,不在UI线程里直接Dispose,而是由算法线程统一管理对象释放。这样能减少很多莫名其妙的崩溃。
你还可能会用到“C# Halcon实现模板匹配、绘制掩膜、排除不需要的点”这类功能。这个思路没有错:先用Halcon在HDevelop里把匹配和掩膜流程调通,确认参数后再把逻辑封装成一个C#可调用的图像处理类。不要在界面上写一大堆Halcon算子,否则编排不清很容易卡死。
5.2 采集线程、处理线程和UI线程要分工
上位机不是一次只处理一张图片的演示程序。相机采集、图像处理、界面刷新、结果上传,这些任务应该拆开:
- 相机采集线程负责抓图,把原始图像放入队列。
- 图像处理线程从队列取图,执行预处理、匹配或测量,并输出结果。
- UI线程只负责把最新图像和处理结果显示到界面。
- 通信线程负责和PLC、数据库或MES系统交互。
如果相机采集和处理都在UI线程,一旦处理耗时上升,界面就会无响应,用户容易以为程序崩溃。正确做法是用一个固定大小或可丢弃旧帧的队列来削峰。如果处理速度跟不上采集速度,先降低采集帧率或丢弃部分帧,而不是无限堆积图像。
这里很容易踩的坑是“Task开太多”。不要每来一帧图像就新建一个线程。应使用长期运行的后台线程,或者线程池有限的并行。批量任务也不是并发数越大越好,要知道机器的CPU核心数和单张处理耗时,再做合理估算。
5.3 和海康VisionMaster这类独立软件通信,推荐什么协议
很多项目不是直接调用Halcon,而是先使用海康VisionMaster这样的视觉平台做方案验证,然后再和C#上位机通讯。这时候会出现一个经典问题:用TCP、Modbus、串口还是共享文件?
我建议优先使用TCP/IP作为主协议,消息体用JSON或简单字符串。原因很接地气:TCP可以在同机用回环地址调试,也可以跨工控机部署;消息里的OK/NG、坐标、缺陷类型一眼能看懂;日志方便记录;断线重连也容易实现。
如果同一个工控机里要极低延迟,并且两个软件都是自己开发的,可以直接用SDK或共享内存。但是成熟第三方平台通常不会为你的每个客户提供SDK重新定制,用TCP更能解耦。
串口和Modbus更适合PLC或运动控制卡之间通信,但用来传图像坐标和结果也不是不行,只是协议解析成本偏高。尤其是多视觉工位需要传大量坐标点时,用串口会非常吃力。工业现场选协议不要盲目追求高级,能满足稳定性、可读性和后期维护即可。
6. 从单张测试到批量连续运行,先看资源占用和失败重试
6.1 能跑单张,不代表能跑100张
很多新手的流程是:用样例图调试成功后,就直接上线。等到了现场发现连续跑几十张后卡顿、掉帧、内存上涨,才回头去查问题。
更好的方式是把一次测试拆成三种规模:
- 单张:验证算法流程和输出内容是否正确。
- 100张:验证连续处理下内存是否稳定,耗时有沒有明显跳动。
- 长时间循环:验证相机连接、UI显示和设备通信是否会出现资源泄漏。
100张测试要重点看三类指标:单帧平均耗时、最大耗时、连续处理是否出现内存持续增长。最大耗时比平均耗时更值得关注,因为它决定你是否需要做队列和丢帧策略。
如果项目要求是“拍照后立即出结果”,不是离线处理文件夹里的图片,那时间预算就按“采集时间+预处理时间+算法时间+结果上传时间”来计算。每个环节都要设一个时间上限,任何一个环节超时都要有日志记录。
6.2 并发参数不是越大越好
批量处理文件夹里的图时,很多人喜欢直接把线程数开到CPU核数,甚至再乘2。CPU密集型的图像算法,线程数超过物理核数太多没有意义,反而增加线程切换开销。
如果一张图处理需要100毫秒,8核机器纯并行理论上可以做到大约每秒80张,但实际还要考虑读取磁盘、保存结果、内存带宽和相机SDK占用。建议先用1个线程测出单张耗时,再把线程数设为4到6个,继续观察总耗时变化。如果线程增多后总耗时不再下降,就说明瓶颈在磁盘读写或内存带宽,而不是CPU核心数。
批量任务还需要考虑失败重试。不要在批处理中间随便跳过错误。建议每个任务维护一个状态:待处理、处理中、成功、失败。失败超过设定次数后,把文件名和错误原因写入独立日志,不要把所有错误都堆到一个弹窗里。
6.3 输出命名和日志是批量任务里最容易翻车的地方
批量流水线运行时,很多人图省事,用“序号+时间戳”给结果文件命名。时间如果重复,旧文件可能被覆盖;今天跑的文件和昨天跑的文件混在一起,根本分不清是哪一批。
更稳妥的命名方法是使用产品条码、相机编号、日期和序号组合。比如CAM01_20250618_134500_0001.png。如果产品有条码,优先用条码名;没有条码,再加日期和序号。
日志至少要包含时间、文件名、耗时、处理结果、异常信息。不是只在出错时写日志,成功也要写,否则你无法确认哪些任务已经处理完成。断点续跑也是靠日志或状态表实现的,处理不完整时只需要重启后读取未完成的文件。
不要把输出目录和日志放在C盘系统盘根目录里,也不要放在很深的用户目录中。工业上位机尽量用固定英文目录,并且程序在启动时检查目录是否存在、是否有写权限。这些问题看起来和图像处理无关,但恰恰决定了软件能不能在连续生产环境中扛住。
7. 常见报错排查顺序和零基础转行路线建议
7.1 相机打不开、黑屏、加载失败怎么查
整理一个我平时排查问题的顺序表,适用于Halcon上位机开发中的大部分异常:
| 现象 | 优先检查项 | 排查方式 |
|---|---|---|
| 相机打不开或超时 | 相机厂商SDK能否打开,IP和防火墙 | 先用厂商软件预览画面,确认网口或USB状态 |
| 图像黑屏或全灰 | 曝光太小,相机没有触发,采集时序不对 | 用连续采集模式,把曝光调亮,观察数值变化 |
| 图像花屏或横纹 | 网线质量、带宽不足、USB口供电不稳 | 看丢包统计,换线,检查巨型帧设置 |
| HalconDLL加载失败 | 项目位数、引用路径、运行时文件缺失 | 确认x64/x86一致,重新添加官方DLL引用 |
| HObject内存占用高 | 是否忘记Dispose | 搜索代码里new图片和采集返回对象的释放逻辑 |
| 算法速度突然变慢 | 队列堆积、磁盘写入慢、后台线程冲突 | 看CPU、内存、磁盘读写和等待队列 |
如果报错信息是Halcon内部错误,不要急着改算法。先看错误发生在哪个算子,再检查这个算子的输入图像是否是空对象、路径是否存在、参数类型是否正确。很多时候是前置条件没有满足,并不是算子本身有问题。
排查顺序可以固定为:先看现象是报错、卡住、还是结果错;再看输入图像和路径;接着看依赖和系统环境;最后才怀疑参数和算法逻辑。这一套顺序能帮你过滤掉掉最多的问题。
7.2 零基础转行上位机,学习主线不能跑偏
如果你是从零开始转行上位机,不要把时间全部花在Halcon复杂例程上。更合理的学习主线是:
- 第一步:掌握一种上位机语言的基础,比如C#的界面、事件、委托、线程。
- 第二步:至少学会串口和Modbus通信,并知道TCP通信的基本写法。
- 第三步:做一个小工具,能读取图片、显示图片、保存结果,不涉及Halcon也完全可以。
- 第四步:把Halcon放进C#程序里,跑通一个单张图像预处理并显示。
- 第五步:加入真实相机,通过厂商SDK或Halcon采集接口完成取图。
- 第六步:设计一个最小项目:按钮触发拍照,预处理后判断OK或NG,把结果显示出来。
每一步都要有一个能运行的小程序作为成果。只读Halcon算子手册没有用,因为上位机的核心是“把每一步串起来”。你现在可能看到很多“Halcon安装教程”“Halcon算子中文手册”之类的词,可以把它们作为辅助,但不能只停留在看教程的阶段。
7.3 能让你站稳的,是把“单任务跑稳”当成底线
很多项目表面上很复杂,实际拆开后,核心就是“采集一帧稳定图像,预处理,显示,输出结果”。难点往往不在某个深度学习模型,而在稳定:长时间不崩溃、参数变化可解释、异常情况有日志、失败任务能重试。
如果要做Halcon模板匹配、测量或深度学习检测,先用HDevelop把最差的光照样本找出来,确定预处理方案,再封装到上位机里。不要把默认参数直接带到现场,默认参数适合入门,不一定适合生产。
最后留一个判断标准:上位机程序连续运行几百次后,内存不涨、相机不掉线、日志完整、结果可复现。达到这个状态,你再去扩展多相机、复杂通信和深度学习推理。否则,功能再炫也只是一个Demo,不是可交付的工业视觉软件。