ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C#与Halcon集成:构建工业级多相机视觉测量系统实战

C#与Halcon集成:构建工业级多相机视觉测量系统实战 简介本资源是一套面向工业视觉测量初学者与产线开发工程师的四相机协同测量项目源码基于C#与Halcon实现集成海康威视相机SDK解决多视角同步采集、特征识别与高精度尺寸标定等典型产线需求。压缩包共114个文件含17个核心C#源码文件如Measure_nut.csproj、6个Halcon动态库DLL、25个CSV格式测量结果数据、11个resources资源文件及配置类文件整体15.93MB结构清晰模块划分明确便于按功能快速定位学习。已有294人下载学习是少有的将模板匹配、圆形/直线拟合、像素标定、串口与网口通讯集成于同一工程的实战案例。源码注释充分、逻辑分层合理包含完整采图控制、图像处理流水线、测量结果保存及UI交互模块可直接运行调试亦可拆解为单相机测量范例用于教学或二次开发。1. 项目概述从零构建一个工业级四相机测量系统最近在做一个视觉测量项目客户要求用四个海康工业相机同步采集对产品进行多角度的尺寸和形位公差测量。这个需求在精密制造、3C电子装配检测里很常见比如要测一个手机中框单相机视野覆盖不全或者有遮挡就需要多相机从不同角度“合围”拍摄再把图像拼起来或者分别测量关键特征。我选的技术栈是C#做上位机软件框架调用海康威SDK驱动相机用Halcon做核心的图像处理和测量算法。这套组合在工业现场非常能打C#开发效率高WinForm或WPF做界面和流程控制得心应手海康的相机稳定、SDK文档全Halcon的测量工具库强大到没朋友。整个项目从相机选型、SDK集成、多线程采集同步到Halcon标定、测量算子应用最后用C#把数据和流程串起来踩了不少坑也积累了一整套实战经验。如果你也在做类似的多相机视觉测量项目或者对其中任何一个环节有疑问这篇总结应该能帮你省下大量摸索的时间。2. 核心需求解析与技术选型背后的逻辑2.1 为什么是“四相机”与“测量”多相机测量不是简单地把几个摄像头摆上去就行。四相机的布局通常由被测物的尺寸、测量精度要求和现场空间共同决定。比如测量一个长方体的六个面理论上需要六个相机但考虑到成本和安装往往用四个相机两个拍长边两个拍宽边通过算法补偿缺失面的数据。这里的核心需求是同步性和数据融合。四个相机必须在同一时刻微秒级触发拍照否则物体如果移动拍出来的图像就有时间差后续的拼接或测量基准就对不上了。测量项目则意味着对精度有硬性要求不是简单的“有没有”而是“差多少微米”。这直接引出了两个技术关键点一是相机的硬件触发与软件同步机制二是世界坐标系的统一也就是我们常说的“标定”。2.2 为什么选择C# 海康SDK Halcon这个技术栈这是一个经过市场验证的黄金组合每个选择都有其深刻的工程考量。C#作为上位机语言在Windows工业控制领域C#凭借.NET Framework/WinForm/WPF的成熟生态在开发人机界面HMI、数据管理、通信如与PLC的Socket、OPC UA和流程控制方面效率极高。它的多线程编程模型Thread,Task,async/await对于管理多个相机的并行采集、处理流水线至关重要。相比于C开发速度更快界面更美观相比于LabVIEW等图形化语言它更灵活更适合复杂逻辑和算法集成。海康威视工业相机及其SDK海康在安防领域的积累使其工业相机产品线性价比很高SDKMVS或MVViewer提供C/C接口稳定性和兼容性不错。对于多相机项目SDK中的硬件触发和组播功能是必需品。我们可以通过一块IO卡或者主相机的触发信号输出同步触发其他从相机实现硬件层面的同步。SDK也提供了查询和设置相机参数增益、曝光、触发模式的接口这是保证图像质量一致性的基础。Halcon作为视觉算法引擎这是核心中的核心。Halcon在计量级测量方面是行业标杆。它提供了丰富的卡尺工具、边缘提取、亚像素轮廓处理、几何拟合圆、直线、矩形等算子精度可达亚像素级别。更重要的是它的标定工具。对于多相机测量我们需要进行两个层次的标定单相机标定校正每个相机自身的镜头畸变径向、切向确保图像上的点是“准”的。手眼标定多相机标定确定四个相机之间的相对位置关系将它们拍摄的图像统一到一个全局的世界坐标系下。这是实现多视角数据融合的数学基础。Halcon的calibrate_hand_eye等算子封装了复杂的算法大大降低了实现难度。这个技术栈的分工很明确C#是“大脑”和“手脚”负责调度、交互和通信海康SDK是“感官神经”负责获取高质量的原始图像数据Halcon是“智慧核心”负责从数据中提取精确的测量信息。三者通过API调用紧密结合。注意技术选型也带来了挑战。海康SDK是C的需要用到C#的P/Invoke技术进行封装调用内存管理和回调函数处理要格外小心。Halcon的运行时授权License在部署时是个麻烦事需要妥善处理。此外C#、Halcon和海康SDK的版本兼容性也需要提前测试。3. 系统架构设计与多相机同步策略3.1 软件整体架构设计一个稳健的四相机测量系统软件架构上通常采用“生产者-消费者”模式并严格区分界面线程和工作线程避免界面卡顿。设备管理层这是最底层用C#封装海康SDK的DLL。为每个相机创建一个独立的设备类HKCamera内部处理相机的连接、断开、参数设置曝光、增益、触发模式、图像采集同步/异步、以及SDK回调函数。这里的关键是将SDK的C风格回调转换成C#的事件event方便上层订阅。图像采集与缓冲层四个相机对象在独立的线程中运行。当设置为硬件触发模式时它们等待同一个外部触发信号。收到信号后几乎同时开始曝光图像数据通过SDK回调到达。为了避免处理线程阻塞采集每个相机配备一个线程安全的图像队列如ConcurrentQueueHImage。采集线程将获取到的Halcon图像对象HImage快速推入队列然后立即准备下一帧采集。图像处理与测量层这是核心算法层。可以启动多个处理线程例如4个与相机一一对应或一个线程处理所有队列。处理线程从对应的图像队列中取出图像调用Halcon的测量算法。这里涉及Halcon算子的调用例如FindCalibPlate用于标定板识别。MeasurePairs或MeasurePos用于边缘对检测计算距离。FitCircleContourXld用于拟合圆。 所有算子调用需封装在try...catch中并注意及时释放Halcon对象HImage,HRegion等防止内存泄漏。数据管理与界面层测量结果如直径、距离、角度等通过线程安全的方式如Invoke或数据绑定传递到主界面线程进行显示、记录和判断。同时需要设计一个数据库如SQLite或文件来存储每一帧的原始图像路径、测量结果、时间戳以及NG/OK状态。3.2 多相机同步的三种方案与选择同步是多相机系统的生命线。不同方案的成本和精度差异巨大。同步方案实现方式优点缺点适用场景软件触发C#程序依次调用每个相机的GrabImage或GrabImageAsync函数。实现简单无需额外硬件。同步精度差毫秒级受操作系统线程调度影响大严格来说不是“同步”而是“顺序执行”。对同步要求不高的静态物体拍照或调试阶段。硬件触发推荐使用外部触发源如PLC、传感器、IO卡发出一个脉冲信号同时接入所有相机的Trigger In接口。相机配置为“上升沿触发”或“高电平触发”。同步精度极高微秒级与软件和系统负载无关稳定可靠。需要额外的触发信号源和布线。绝大多数工业测量场景的首选确保图像采集时刻一致。组播主从指定一个相机为主设备将其Line Out如Strobe信号连接到其他从相机的Trigger In。主相机收到软触发或硬触发后在曝光同时发出信号触发从相机。利用相机自身功能无需额外触发源。同步性较好。依赖相机硬件功能布线稍复杂主相机故障会影响全部。相机本身支持且现场布线方便的场景。我们的选择与实操对于测量项目毫不犹豫地选择硬件触发。我们使用了一块多功能IO卡如研华、凌华的产品由PLC或上位机C#程序控制IO卡发出一个5V的脉冲信号。四台海康相机的触发线通常是光耦隔离的并联接入这个信号。在海康SDK中需要将每个相机的TriggerMode设置为OnTriggerSource设置为Line0或其他指定的输入线。这样一个脉冲过来四台相机同时开始曝光。实操心得硬件触发布线时注意信号线的长度尽量一致以减少信号延迟差异。如果距离远考虑使用差分信号传输以提高抗干扰能力。在SDK设置中还有一个关键参数叫TriggerDelay可以微调每个相机的触发延时用于补偿因布线长度不同带来的微小差异实现更极致的同步。4. 海康SDK集成与相机控制的C#实战4.1 封装海康SDK的C#类库海康提供的SDK通常是MvCameraControl.Net.dll或一系列C的DLL。我们需要创建一个C#类来封装这些底层调用。using System; using System.Runtime.InteropServices; using System.Drawing; using HalconDotNet; // 用于将SDK数据转为Halcon的HImage public class HKCamera : IDisposable { private IntPtr m_hDeviceHandle IntPtr.Zero; // 设备句柄 private string m_serialNumber; private bool m_isGrabbing false; // 导入海康SDK的C函数 [DllImport(MvCameraControl.dll)] private static extern int MV_CC_EnumDevices(uint nTLayerType, ref MV_CC_DEVICE_INFO_LIST pstDevList); // ... 导入其他所需函数如 MV_CC_CreateHandle, MV_CC_OpenDevice, MV_CC_StartGrabbing, MV_CC_GetOneFrameTimeout... // 定义SDK所需的回调函数委托 private delegate void ImageCallBack(IntPtr pData, ref MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser); private ImageCallBack m_imageCallback; // 定义图像到达事件 public event ActionHImage ImageGrabbed; public HKCamera(string serialNumber) { m_serialNumber serialNumber; m_imageCallback new ImageCallBack(OnImageGrabbed); } public bool Connect() { // 1. 枚举设备根据序列号找到目标相机 // 2. 调用 MV_CC_CreateHandle 创建设备句柄 // 3. 调用 MV_CC_OpenDevice 打开设备 // 4. 注册回调函数 MV_CC_RegisterImageCallBack // ... 具体代码需参考海康SDK编程手册 return true; } public void SetTriggerMode(bool isTriggerOn) { // 设置触发模式 // MV_CC_SetEnumValue(TriggerMode, isTriggerOn ? 1 : 0); // MV_CC_SetEnumValue(TriggerSource, 0); // 例如Line0作为触发源 } public void StartGrabbing() { if (MV_CC_StartGrabbing(m_hDeviceHandle) 0) { m_isGrabbing true; } } // SDK回调函数 private void OnImageGrabbed(IntPtr pData, ref MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser) { // 将pData中的图像数据通常是RAW或BGR格式转换为Halcon的HImage对象 HImage hImage ConvertBufferToHImage(pData, pFrameInfo); // 通过事件通知上层 ImageGrabbed?.Invoke(hImage); } private HImage ConvertBufferToHImage(IntPtr pData, MV_FRAME_OUT_INFO_EX frameInfo) { // 这是一个关键且容易出错的数据转换过程 // 假设相机输出是8位单通道Mono8或24位BGR if (frameInfo.enPixelType PixelType_Gvsp_Mono8) { // 创建Halcon图像 HImage image new HImage(); image.GenImage1(byte, frameInfo.nWidth, frameInfo.nHeight, pData); return image; } // 其他像素格式需要相应转换... return null; } public void Dispose() { if (m_isGrabbing) MV_CC_StopGrabbing(m_hDeviceHandle); if (m_hDeviceHandle ! IntPtr.Zero) MV_CC_CloseDevice(m_hDeviceHandle); MV_CC_DestroyHandle(m_hDeviceHandle); } }4.2 多相机管理类的实现有了单个相机类我们需要一个管理器来统一管理四个相机实例处理它们的生命周期和同步启动。public class CameraManager { private ListHKCamera m_cameras new ListHKCamera(); private ListConcurrentQueueHImage m_imageQueues new ListConcurrentQueueHImage(); public void InitializeCameras(Liststring cameraSerialNumbers) { foreach (var sn in cameraSerialNumbers) { var cam new HKCamera(sn); if (cam.Connect()) { cam.SetTriggerMode(true); // 设置为硬件触发模式 cam.ImageGrabbed OnCameraImageGrabbed; // 订阅图像事件 m_cameras.Add(cam); m_imageQueues.Add(new ConcurrentQueueHImage()); } } } public void StartAllCameras() { // 先让所有相机开始“监听”硬件触发信号 foreach (var cam in m_cameras) { cam.StartGrabbing(); } // 然后通过IO卡或软件指令发出一个硬件触发脉冲 TriggerHardwarePulse(); } private void OnCameraImageGrabbed(HImage image, int cameraIndex) { // 将图像放入对应相机的队列 m_imageQueues[cameraIndex].Enqueue(image); } public HImage GetImageFromQueue(int cameraIndex, int timeoutMs) { // 处理线程从队列中取图 HImage image null; m_imageQueues[cameraIndex].TryDequeue(out image); return image; } }注意事项ConvertBufferToHImage函数是性能和数据正确性的关键。必须根据海康SDK中MV_FRAME_OUT_INFO_EX结构体里的enPixelType像素格式和nWidth、nHeight来正确构造Halcon图像。格式不对会导致图像错乱或Halcon算子报错。此外SDK回调函数运行在非UI线程在事件中更新UI一定要用Control.Invoke或Dispatcher.Invoke。5. Halcon标定与测量算法的深度集成5.1 相机标定从像素到世界的钥匙标定是测量精度的基础分为两步1. 单相机标定内参标定目的是获取相机的内部参数焦距f、主点cx, cy和畸变系数k1, k2, k3, p1, p2。我们使用Halcon的标定板如圆形点阵标定板。// C#中调用Halcon标定算子需在Halcon脚本中生成标定板描述文件calib.descr HOperatorSet.ReadCamPar(calib_data/camera_parameters.dat, out hv_CamParam); HOperatorSet.FindCalibPlate(image, hv_CalibDataID, 0, 0, new HTuple(), new HTuple()); HOperatorSet.GetCalibData(hv_CalibDataID, camera, 0, params, out hv_CamParamOut);操作流程固定相机从不同角度拍摄约15-20张标定板图像。Halcon的find_calib_object算子会自动识别标定板上的点并通过calibrate_cameras计算出内参。将最终的内参hv_CamParamOut保存为.dat文件供后续测量使用。2. 手眼标定外参标定/多相机标定目的是确定四个相机之间的相对位置和姿态旋转矩阵R和平移向量T。这需要将一个已知尺寸的标定板或特征物同时放在所有相机的公共视野中或者通过一个在多个相机间移动的标定板来实现。// 假设我们已经有了四个相机的内参和各自拍摄的带有标定板的图像 // 创建标定模型 HOperatorSet.CreateCalibData(hand_eye, 4, 1, out hv_CalibDataID); // 设置每个相机的内参 HOperatorSet.SetCalibDataCamParam(hv_CalibDataID, 0, hv_CamParam0); // ... 设置其他相机内参 // 设置标定板参数 HOperatorSet.SetCalibDataCalibObject(hv_CalibDataID, 0, hv_CalibObjDescr); // 为每张图像找到标定板并添加观测 HOperatorSet.FindCalibPlate(image_cam0, hv_CalibDataID, 0, 0, 0, new HTuple()); // ... // 执行手眼标定 HOperatorSet.CalibrateHandEye(hv_CalibDataID, out hv_Errors); // 获取相机1相对于相机0的位姿 HOperatorSet.GetCalibData(hv_CalibDataID, camera, 1, pose, out hv_Pose1To0);得到hv_Pose1To0等外参后我们就可以将相机1图像上的一个点通过内参和外参转换到相机0的世界坐标系下实现多视角数据的统一。5.2 核心测量算子的应用与参数调优标定完成后就可以进行精确测量了。Halcon提供了多种测量工具。边缘测量最常用的是measure_pairs和measure_pos。你需要定义一条“测量矩形”ROI算子会在这个矩形区域内寻找边缘。// 创建测量矩形 HOperatorSet.GenMeasureRectangle2(row, column, phi, length1, length2, width, height, nearest_neighbor, out hv_MeasureHandle); // 执行边缘对测量 HOperatorSet.MeasurePairs(image, hv_MeasureHandle, sigma, threshold, positive, first, out hv_RowEdgeFirst, out hv_ColumnEdgeFirst, out hv_AmplitudeFirst, out hv_RowEdgeSecond, out hv_ColumnEdgeSecond, out hv_AmplitudeSecond, out hv_IntraDistance, out hv_InterDistance);sigma高斯滤波系数和threshold边缘幅度阈值是两个关键参数。sigma越大边缘越平滑抗噪性好但可能丢失细节threshold决定了多大强度的边缘才被认可。需要根据实际图像对比度反复调整。几何拟合测量得到的边缘点可能是离散的我们需要拟合出标准的几何形状。// 将边缘点生成XLD轮廓 HOperatorSet.GenContourPolygonXld(out hv_Contour, hv_RowEdges, hv_ColumnEdges); // 拟合圆 HOperatorSet.FitCircleContourXld(hv_Contour, algebraic, -1, 0, 0, 3, 2, out hv_RowCenter, out hv_ColumnCenter, out hv_Radius, out hv_StartPhi, out hv_EndPhi, out hv_PointOrder);拟合方法如algebraic,geometric和参数迭代次数、权重会影响拟合精度和抗噪性。实操心得测量ROI的放置非常讲究。它应该垂直于你期望检测的边缘。phi角度设置错误会导致测量失败。对于弱边缘或复杂背景可以先进行图像预处理如emphasize增强边缘或threshold分割出感兴趣区域再在区域内进行测量能大大提高稳定性和精度。6. C#上位机软件框架与性能优化6.1 基于WPF的MVVM软件架构对于复杂的工业软件推荐使用WPF配合MVVMModel-View-ViewModel模式。这能将界面逻辑与业务逻辑彻底分离便于测试和维护。Model代表数据和业务逻辑例如CameraModel封装相机状态、MeasurementResultModel封装测量结果。View就是XAML文件定义用户界面。我们用HalconDotNet的HWindowControlWPF控件来显示Halcon图像。注意原生的HWindowControl是WinForm控件在WPF中需要使用Windows Forms Host来承载或者寻找第三方的WPF版本封装。图像显示需要将Halcon的HImage对象转换为WPF的BitmapSource。ViewModel连接View和Model的桥梁。它包含命令ICommand和可绑定属性INotifyPropertyChanged。例如一个StartAcquisitionCommand被触发时会调用CameraManager.StartAllCameras()。这种架构下图像处理线程将测量结果更新到ViewModel的属性中通过数据绑定自动刷新UI非常清晰。6.2 多线程、内存与性能陷阱多相机系统是资源消耗大户处理不当极易卡顿、崩溃。图像队列与生产者-消费者如前所述这是解耦采集和处理、保证流畅性的关键。队列大小要合理如100帧满了则丢弃最旧帧并记录丢帧告警。Halcon对象生命周期管理Halcon的HObjectHImage,HRegion等是本地对象必须显式释放。在C#中虽然HalconDotNet封装了Dispose方法但最佳实践是使用using语句或在finally块中释放。HImage image null; try { image new HImage(byte, width, height, ptr); // ... 处理图像 } finally { image?.Dispose(); }C#与Halcon交互性能频繁创建和销毁Halcon对象开销大。可以考虑复用对象池。另外将图像数据从C#数组或指针传递到Halcon或从Halcon取回结果存在数据拷贝开销。对于实时性要求极高的场景需要评估这部分损耗。UI更新优化不要在图像处理线程中直接更新UI上的每一个像素或结果。应该批量更新或者使用Throttle节流技术例如每处理完10帧或100ms才更新一次UI界面上的数据和图表。7. 项目实战中的常见问题与深度排查7.1 海康SDK集成与相机控制问题问题1MV_CC_EnumDevices返回失败或找不到相机。排查首先检查相机是否通过网线/USB线正确连接IP地址是否设置正确对于网口相机。确保安装了对应相机型号的最新驱动和MVS软件。尝试以管理员身份运行你的C#程序因为某些SDK需要权限访问硬件。解决使用海康自带的MVS或IPConfig工具先确认能发现和打开相机。如果工具可以但你的程序不行检查SDK DLL的版本是否匹配以及是否放在了程序的执行目录下。问题2图像采集回调函数不触发。排查确认相机已成功StartGrabbing。检查触发模式如果设置了硬件触发请确保外部触发信号已经给出如果设置了软触发确认调用了MV_CC_SetCommandValue(TriggerSoftware)。在回调函数内部加日志看是否进入。解决在海康MVS软件中打开相机用它的界面触发拍照看是否有图像。如果有对比MVS中的参数设置尤其是触发相关参数与你代码中的设置是否完全一致。问题3转换后的Halcon图像花屏或尺寸不对。排查99%的问题出在ConvertBufferToHImage函数。仔细核对MV_FRAME_OUT_INFO_EX中的enPixelType。是Mono8还是BayerRG8还是BGR8nWidth和nHeight是否正确对于非Mono8格式需要先转换。例如BGR8需要先转换成RGB或灰度图再生成HImage。解决写一个测试函数将回调收到的原始数据pData保存为二进制文件然后用Halcon的read_image或专业的图像查看工具打开验证数据本身是否正确。再逐步调试转换代码。7.2 Halcon算法与标定问题问题1find_calib_object找不到标定板。排查标定板图像是否清晰光照是否均匀标定板是否在视野内且完整CalibObjDescr文件描述的标定板尺寸、点间距是否与实际物理标定板一致解决调整光照和相机焦距确保标定板图像对比度高。在HDevelop中手动运行find_calib_object调整StartCamParam初始相机参数可以粗略估计和CalibObjDescr路径直到能稳定找到。问题2标定后测量结果依然不准。排查标定板质量标定板本身精度不够或拍摄时标定板不平与相机成像面不平行。标定图像数量与角度拍摄的标定板图像角度不够多未能充分覆盖相机视野和可能的畸变区域。至少需要10张以上且标定板应出现在视野的不同位置、不同倾斜角度。世界坐标与像素尺寸标定后得到的CamParam包含了焦距等内部参数但没有直接给出“每个像素对应多少毫米”。这个比例因子需要通过已知物理尺寸的物体来反推或者使用image_points_to_world_plane算子将像素坐标转换到标定板平面Z0的世界坐标系。解决使用更高精度的标定板。增加标定图像的数量和多样性。在测量代码中必须使用campar和pose如果有多相机还需要外参来将像素距离转换到世界坐标距离而不是简单地用像素数乘以一个固定系数。问题3measure_pairs找不到边缘或找错边缘。排查检查测量矩形ROI的位置和角度phi是否与待测边缘垂直。sigma和threshold参数是否合适图像预处理是否足够解决在HDevelop中打开一张实测图像手动调整gen_measure_rectangle2和measure_pairs的参数观察边缘提取效果。将调试好的参数固化到代码中。对于复杂背景可以先做threshold或connection分割出目标区域再将ROI限制在该区域内。7.3 C#系统集成与部署问题问题1程序在本机运行正常到工控机上崩溃或找不到Halcon/DLL。排查这是典型的部署环境问题。检查目标机器是否安装了对应版本的Halcon运行时Runtime或完整版以及VC Redistributable。海康SDK的依赖项是否齐全解决使用Halcon提供的hdeploy工具打包你的程序所需的Halcon库。将海康SDK的所有DLL包括可能依赖的MediaLog.dll,MvCameraControl.dll等一并拷贝到程序根目录。确保所有路径都是相对的或者通过AppDomain.CurrentDomain.BaseDirectory获取。问题2运行一段时间后内存持续增长内存泄漏。排查重点检查三个地方1) Halcon对象HImage,HRegion等是否Dispose2) C#中封装的SDK回调函数传入的IntPtr图像数据缓冲区SDK是否会在回调结束后自动释放有些SDK需要你在回调函数中调用MV_CC_FreeImageBuffer3) 事件订阅与取消订阅是否成对出现防止事件持有对象导致无法回收。解决使用.NET Memory Profiler或dotMemory等工具分析内存快照查看哪些类型的对象没有被释放。严格遵循IDisposable模式在finally块或using语句中释放资源。问题3多线程环境下UI控件访问异常。排查任何在非UI线程如图像处理线程、SDK回调线程中尝试更新WPF或WinForm控件的操作都会抛出InvalidOperationException。解决统一使用Dispatcher.InvokeWPF或Control.InvokeWinForm来封送UI更新操作。// WPF示例 Application.Current.Dispatcher.Invoke(() { this.ImageControl.Source ConvertHImageToBitmapSource(halconImage); this.ResultTextBlock.Text measurementResult; });这个四相机测量项目就像搭积木每一块相机控制、图像传输、算法处理、数据显示都要扎实连接处同步、标定、数据流更要严丝合缝。最大的体会是理论上的方案到稳定运行的代码之间隔着一万个细节和坑。比如硬件触发信号线上的一个毛刺就可能导致某一帧图像丢失Halcon标定板的一个角点识别不准整个测量系统的精度就毁了。所以一定要分模块测试从单个相机、单个功能测起用MVS确认相机工作正常用HDevelop脚本验证Halcon算法流程最后再用C#把它们像拼图一样组合起来并在每个环节加入充分的日志和异常处理这样当现场出现问题时你才能快速定位到是“积木”本身的问题还是“连接”的问题。本文还有配套的精品资源点击获取
返回列表