翼度科技»论坛 编程开发 .net 查看内容

海康网络相机封装库分享

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
前言

最近做项目过程中,使用到了海康相机,官方只提供了C/C++的SDK,没有搜寻到一个合适的封装了的C#库,故自己动手,简单的封装了一下,方便大家也方便自己使用和二次开发
项目地址:https://github.com/martixjohn/HikvisionNetworkCameraSdkForCsharp
项目结构
  1. ├─Dlls/
  2. ├─Native/
  3. │                HCNetSDK.cs
  4. ├─ CameraDevice.cs
  5. ...
复制代码
项目很简单,主要就提供了两个类:

  • 一个是CameraDevice.cs:相机API使用
    主要接口和成员如图

  • HCNetSDK.cs:对C++的头文件的封装,包含常用的类型的声明等
    (由官方提供的Demo进行修改,并小修小补,修复了部分Bug)

使用

拷贝动态链接库DLL

拷贝动态链接库到程序目录,或者程序能访问到的地方,内部运行时自动链接
这里有个巧妙地办法:使用环境变量
  1. string originalPath = Environment.GetEnvironmentVariable("Path") ?? string.Empty;
  2. originalPath = Regex.Replace(originalPath, "^" + Path.PathSeparator, string.Empty);
  3. // 加入当前目录的bin
  4. Environment.SetEnvironmentVariable("PATH", "bin" + Path.PathSeparator + originalPath);
复制代码
重点在Environment.SetEnvironmentVariable("PATH", ...),因为程序一般运行都会访问PATH环境变量
示例
  1. // 初始化相机SDK,涉及非托管内存分配
  2. CameraDevice.InitializeSdk();
  3. string userName = "admin";
  4. string password = "password";
  5. string iP = "192.168.18.1";
  6. ushort port = 8000;
  7. // CameraDevice实现了IDisposable
  8. using(CameraDevice camera = new(userName, password, iP, port)){
  9.         try{
  10.                 // 需要登录才能使用, 阻塞
  11.                 camera.Login();
  12.                 Console.WriteLine("登录成功! {0}", camera.UserName);
  13.         } catch (Exception e) {
  14.                 Console.WriteLine("exception: {0}", e);
  15.                 return;
  16.         }
  17.         try{
  18.                 // 直接从流中获取图片
  19.                 byte[] image = camera.DirectlyCaptureJpegImage();
  20.                 // ImageSharp
  21.                 Image<Rgb24> rgb24 = Image.Load<Rgb24>(image);
  22.                 // ...
  23.         } catch(Exception e){
  24.                 Console.WriteLine("exception: {0}", e);
  25.                 return;
  26.         }
  27.         // 自己处理流数据 (使用回调,非阻塞)
  28.         camera.StartFetchVideoStream((streamType, data) => {
  29.                 if(streamType == StreamType.Header) {
  30.                         // ...
  31.                 } else if(streamType == StreamType.Body) {
  32.                         // ...
  33.                 }
  34.         });
  35.         // 模拟进行其他任务
  36.         Stopwatch stopwatch = Stopwatch.StartNew();
  37.         while (stopwatch.ElapsedMilliseconds < 3000)
  38.         {
  39.                 // ...
  40.         }
  41. }
  42. // 程序运行结束,销毁SDK资源(非托管)
  43. CameraDevice.CleanUpSdk();
复制代码
结束语

项目很简单,依然有不足,大家可能还是需要根据具体业务进行二次开发来。
总之欢迎大家使用,若感兴趣欢迎参与贡献!

来源:https://www.cnblogs.com/onecainiao/p/18357459
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具