☰
C#调HALCON读GigE相机:HSmartWindowControl缩放平移
2026/10/28 15:16:37 网站建设 项目流程

简介:C# 调用 Halcon 读取海康相机并在 HSmartWindow 上完成平移缩放的完整示例工程,面向已具备 C# 基础、正在做工业视觉上位机开发的初、中级工程师。工程演示了 HalconDotNet 引用的引入方式、相机设备的打开与图像异步采集、HObject 图像在显示控件上的呈现,以及通过窗口操作模式与鼠标滚轮、移动事件实现画面平移与缩放,可直接作为检测、定位类项目的显示模块骨架,也可用于排查采集与显示之间的线程同步问题。压缩包共 46 个文件、约 22.53MB,以 .cs 源码为核心,配合 .csproj 与 .sln 项目文件、.config 配置、.dll 依赖库、.exe 与 .pdb 可执行及调试文件,另有 .resx 资源与 VS 缓存等辅助文件,解压后即可在 Visual Studio 中打开调试对照。内容已有 929 人学习,适合拿来参考采集流程,并搭建可交互的图像显示窗口。

1. 从回调到窗口:C# 调 HALCON 读国产 GigE 相机这条路,卡人的从来不是取流

上周帮人排查一个上位机,相机取流一秒 30 帧很稳,可鼠标滚轮一推,图像就跳出去半屏;拖到边缘松手,画面又弹回原点。这套「C# 调 HALCON、把相机画面塞进 HSmartWindowControl、再自己做平移缩放」的组合,真正的难点几乎全在后半段——取流只是把字节搬进来,决定操作手感的是 part 与窗口坐标系之间的换算。这篇按一条能跑通的链路写:SDK 环境对齐、回调里把裸指针变成 HObject、SetPart 怎么算才不被拉扁、滚轮锚点缩放和拖拽平移怎么落地,最后把几次出错的情形列出来。做工业视觉上位机、要在预览画面上叠 ROI、又不想被控件原生交互牵着走的人,可以照着抄一遍。

2. 三个依赖先对齐:工程骨架搭不起来,后面全是白忙

这套组合的失败有一半发生在写第一行业务代码之前。有人引用错了 DLL,有人 32 位运行库配 64 位进程,有人控件拖上去设计器直接崩。先把依赖关系理清楚,后面调相机和调 part 才有意义。

2.1 引用清单:两个托管库加一堆运行库

HALCON 的 .NET 程序集分两种:halcondotnet.dll面向 .NET Framework(4.6.1 以上都能用),halcondotnetxl.dll面向 .NET 5/6/8。后者不是所有 HALCON 版本都完整,尤其是 HSmartWindowControl 的 WinForms 版本,老版本里缺胳膊少腿是常事。我一般的做法是:新项目没有强制的 .NET Core 要求,就直接上 .NET Framework 4.8,省掉一大半兼容性排查。

相机侧的托管封装通常是 SDK 安装目录下Development\DotNet\win64\MvCamCtrl.NET.dll,配套的MvCameraControl.dll、MvCameraControlWrapper.dll这类底层库在Runtime\Win64_x64里。托管 DLL 引用进来只是编译期的事,底层库找不到,运行期照样抛DllNotFoundException。

文件来源作用常见问题
halcondotnet.dllHALCON 安装目录的 dotnet 子目录HObject、HOperatorSet、HWindow、HSmartWindowControl与目标框架版本不匹配
halcondotnetxl.dll同上给 .NET 5/6/8 用老版本里 WinForms 控件支持不全
MvCamCtrl.NET.dll相机 SDK 的 DotNet\win64相机枚举、取流、回调误引 win32 目录里的那份
MvCameraControl.dll相机 SDK 的 Runtime\Win64_x64底层驱动通信没拷到输出目录或 PATH

平台目标这一步也不要省。工程属性里把「平台目标」改成 x64,并把「首选 32 位」取消勾选,否则 AnyCPU 在 64 位系统上有可能以 32 位加载,去加载 64 位的MvCamCtrl.NET.dll,直接BadImageFormatException。看到这个异常,先查平台目标,再查 DLL 位数,基本一次就能定位。

提示:不同厂商 SDK 的类名和函数前缀不一样,有的叫Camera,有的叫MyCamera,参数顺序也略有差别。下文用MyCamera这套常见封装举例,换成你手上那套时注意对着头文件或 IntelliSense 校正。

2.2 最小骨架:先让控件显示一张本地图

不要一上来就接相机。先用本地图把 HALCON 的显示链路跑通,确认控件能正常创建、能调HalconWindow、能显示图像,再去接取流。这一步能在十分钟内排除掉一半的环境问题。

using HalconDotNet; private void btnLoad_Click(object sender, EventArgs e) { // 1. 读一张本地图,验证 HALCON 运行时是否正常 HOperatorSet.ReadImage(out HObject image, @"D:\test\board.png"); HOperatorSet.GetImageSize(image, out HTuple w, out HTuple h); // 2. 关掉自动刷新,连续刷新场景下能明显减少闪烁 HWindow win = hSmartWindowControl1.HalconWindow; win.SetWindowParam("flush", "false"); // 3. 设置显示颜色(灰度图默认是白,彩色图会覆盖) win.SetColor("green"); // 4. 显示并 <p> <a href="https://download.csdn.net/download/butoneren2008/88673981" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询