海康 Unable to load library '../lib/HCNetSDK'

导入AlarmJavaDemo进入MyEclipse

 

先从其他文件那儿拷贝这两个文件过来;

.project

 

改个项目名,其他不动。

.classpath文件不动。 

//这两个文件是给MyEclipse用的,官方demo不是用MyEclipse开发的我估计。

先把loadLibrary的地址改改成如图。 

 

将画线的jar文件build path。

他在文件夹“swing-app-framework”中其实有,不过我之前不知道,自己下载的一个。

如果还不行,下载下面那两个jar文件,也build path。

这些都是swing要用的。

以上操作基本可以了。

o.s.b.SpringApplication - [reportFailure,870] - Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'materialEnterRecordController': Unsatisfied dependency expressed through field 'commonController'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'commonController' defined in URL [jar:file:/C:/erp/java/weigh-admin.jar!/BOOT-INF/classes!/com/ruoyi/web/controller/common/CommonController.class]: Instantiation of bean failed; nested exception is java.lang.UnsatisfiedLinkError: Unable to load library 'C:\erp\java\lib\hikvision\HCNetSDK.dll': 脮也禄碌陆指露篓 at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:660) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.la这个报错是什么原因造成的
最新发布
11-11
完全可以!你提出的这种 **模块化、分层化的 DLL 架构设计**,不仅可行,而且是**工业级机器视觉软件开发中的最佳实践之一**。它具有良好的可维护性、扩展性和团队协作支持能力。 下面我将详细解释你的架构设计,并给出建议的结构、代码示例和注意事项。 --- ## ✅ 你提出的架构(推荐) ```text IVisionCore.dll -- 核心接口定义(抽象) │ ├── Vision.Common.dll -- 公共基础类、工具方法、共享数据结构 ├── Vision.Hik.dll -- 海康相机实现 ├── Vision.Halcon.dll -- Halcon 算法封装 ├── Vision.Basler.dll -- Basler 相机实现(Pylon SDK) └── (可选) Vision.Insp.dll -- 视觉检测流程引擎 / 工序管理 ``` 这个架构遵循了: - **依赖倒置原则(DIP)** - **单一职责原则(SRP)** - **开闭原则(OCP)** > 即:对扩展开放,对修改关闭;高层模块不依赖低层模块的具体实现。 --- ### 🔧 各 DLL 职责说明 #### 1. `IVisionCore.dll` —— 接口契约层(Interface-Only) 只包含接口和枚举,不包含任何具体实现。 ```csharp // IVisionCore.dll namespace IVisionCore { /// <summary> /// 所有相机必须实现的接口 /// </summary> public interface ICamera { bool Connect(); bool Disconnect(); Mat Capture(); // 返回 OpenCvSharp 的 Mat bool IsConnected { get; } string DeviceName { get; } } /// <summary> /// 视觉算法通用接口 /// </summary> public interface IAlgorithm { AlgorithmResult Run(Mat image); void LoadParameters(string configPath); } public class AlgorithmResult { public bool Success { get; set; } public Dictionary<string, object> Data { get; set; } = new(); public double ElapsedMs { get; set; } } } ``` ✅ **优点**: - 上层应用只需引用 `IVisionCore.dll`,无需知道底层用的是海康还是 Basler。 - 可轻松替换相机或算法模块。 --- #### 2. `Vision.Common.dll` —— 基础设施与工具库 存放所有项目共用的内容: ```csharp // Vision.Common.dll namespace Vision.Common { // 基础相机抽象类(可选) public abstract class BaseCamera : ICamera { public abstract bool Connect(); public abstract bool Disconnect(); public abstract Mat Capture(); public virtual void SetExposure(double ms) { /* 默认空实现 */ } public virtual void SetGain(double gain) { } public bool IsConnected => _connected; protected bool _connected; public string DeviceName { get; protected set; } } // 图像处理工具 public static class ImageUtils { public static Mat ResizeIfLarge(Mat src, int maxWidth = 1920) { if (src.Width <= maxWidth) return src; var scale = maxWidth / (double)src.Width; var size = new Size(src.Width * scale, src.Height * scale); var dst = new Mat(); Cv2.Resize(src, dst, size); return dst; } } // 日志服务 public static class Logger { public static void Info(string msg) => Console.WriteLine($"[INFO] {msg}"); public static void Error(string msg) => Console.Error.WriteLine($"[ERROR] {msg}"); } } ``` --- #### 3. `Vision.Hik.dll` —— 海康相机专用实现 引用 `IVisionCore.dll` 和 `Vision.Common.dll`,使用 HikSDK(如 HCNetSDK) ```csharp // Vision.Hik.dll using IVisionCore; using Vision.Common; using HikSDK; // 假设这是包装后的 SDK namespace Vision.Hik { public class HikCamera : BaseCamera { private NET_DVR_DEVICEINFO_V30 _deviceInfo; private int _userId; public override bool Connect() { try { uint port = 8000; IntPtr userID = NET_DVR_Login_V30("192.168.1.64", port, "admin", "password", out _deviceInfo); if (userID == IntPtr.Zero) { Logger.Error("海康登录失败"); return false; } _userId = (int)userID; _connected = true; DeviceName = $"Hik-{_deviceInfo.sSerialNumber}"; return true; } catch (Exception ex) { Logger.Error("连接海康相机异常: " + ex.Message); return false; } } public override bool Disconnect() { if (_connected) { NET_DVR_Logout(_userId); _connected = false; } return true; } public override Mat Capture() { // 使用 SDK 抓图并转换为 Mat var imageData = GetImageFromHikSDK(); // 自定义函数 var bitmap = ConvertToBitmap(imageData); // 转成 GDI+ return OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap); // 转成 Mat } private byte[] GetImageFromHikSDK() => new byte[0]; // 省略细节 private System.Drawing.Bitmap ConvertToBitmap(byte[] data) => null; } } ``` > ⚠️ 注意:需要处理 SDK 初始化、解码、内存释放等问题。 --- #### 4. `Vision.Basler.dll` —— Basler 相机实现(Pylon) ```csharp // Vision.Basler.dll using IVisionCore; using PylonC.NETSupportLibrary; namespace Vision.Basler { public class BaslerCamera : ICamera { private Camera _camera; public bool Connect() { if (!CameraFinder.Enumerate().Any()) { Logger.Error("未发现 Basler 相机"); return false; } _camera = new Camera(CameraFinder.Enumerate()[0]); _camera.Open(); _camera.Parameters[PLCamera.ExposureTime].SetValue(5000); _connected = true; DeviceName = $"Basler-{_camera.CameraInfo.ModelName}"; return true; } public Mat Capture() { _camera.StreamGrabber.Start(1); var grabResult = _camera.StreamGrabber.RetrieveResult(1000, TimeoutHandling.ThrowException); if (grabResult.GrabSucceeded) { using var bitmap = grabResult.ToBitmap(); return OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap); } return null; } public bool Disconnect() { _camera?.Close(); _connected = false; return true; } public bool IsConnected { get; private set; } public string DeviceName { get; private set; } } } ``` --- #### 5. `Vision.Halcon.dll` —— 封装 Halcon 算法 ```csharp // Vision.Halcon.dll using IVisionCore; using HalconDotNet; namespace Vision.Halcon { public class HalconTemplateMatcher : IAlgorithm { private HObject _template; private HTuple _modelId; public AlgorithmResult Run(Mat image) { var result = new AlgorithmResult(); var sw = Stopwatch.StartNew(); try { HObject hImage; HImageConverter.ToHObject(image, out hImage); // 使用 Halcon 模板匹配 HOperatorSet.FindShapeModel(hImage, _modelId, 0, new HTuple(3.14), 0.3, 1, 0.5, "least_squares", 0, 0.9, out HTuple row, out HTuple col, out HTuple angle, out HTuple score); result.Success = score.Length > 0; result.Data["X"] = col.DVal[0]; result.Data["Y"] = row.DVal[0]; result.Data["Score"] = score.DVal[0]; } catch (Exception ex) { result.Success = false; Logger.Error("Halcon 匹配出错:" + ex.Message); } finally { sw.Stop(); result.ElapsedMs = sw.ElapsedMilliseconds; } return result; } public void LoadParameters(string configPath) { // 加载模板等参数 } } } ``` --- ### 📦 最终使用方式(上位机程序) ```csharp // 主程序引用:IVisionCore.dll + Vision.Hik.dll + Vision.Halcon.dll ICamera camera = new HikCamera(); // 或 new BaslerCamera() IAlgorithm algo = new HalconTemplateMatcher(); if (camera.Connect()) { var img = camera.Capture(); var result = algo.Run(img); if (result.Success) { Console.WriteLine($"找到目标:X={result.Data["X"]}, 得分={result.Data["Score"]}"); } } ``` --- ### ✅ 架构优势总结 | 特性 | 是否满足 | 说明 | |------|----------|------| | ✅ 模块解耦 | 是 | 更换相机不影响算法 | | ✅ 易于测试 | 是 | 可 Mock 接口进行单元测试 | | ✅ 支持多厂商设备 | 是 | 插件式接入 | | ✅ 团队分工明确 | 是 | 相机组写 Vision.Hik,算法组写 Vision.Halcon | | ✅ 可发布为 NuGet 包 | 是 | 内部私有包服务器即可 | --- ### ⚠️ 注意事项 1. **版本控制一致性** 所有 DLL 应使用相同的 .NET 版本(推荐 `.NET 6` 或 `.NET Standard 2.0`)。 2. **避免循环引用** - `Vision.Hik` → 只能引用 `IVisionCore` 和 `Vision.Common` - 不允许反向引用! 3. **资源管理要小心** - `Mat`, `HObject`, `Bitmap`, SDK 句柄都要及时释放(实现 `IDisposable`) 4. **异常统一处理** 定义 `VisionException` 统一抛出。 5. **日志建议用接口注入** ```csharp public interface ILogger { void Log(string msg); } ``` --- ### ✅ 总结 你提出的架构 **完全可行且非常专业**,适用于中大型视觉系统开发。它是现代工业软件的标准做法。 只要按以下原则执行: - 接口定义在最上层(`IVisionCore`) - 实现分离到独立 DLL - 使用依赖注入加载具体实现 - 配置文件控制使用哪个相机/算法 就可以打造一个真正“通用、稳定、可扩展”的 C# 视觉平台。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值