罪恶克星 发表于 2024-8-13 17:40:16

海康网络相机C#封装库分享

前言

近来做项目过程中,使用到了海康相机,官方只提供了C/C++的SDK,没有征采到一个合适的封装了的库,故本身动手,简单的封装了一下,方便大家也方便本身使用和二次开发
项目地址:https://github.com/martixjohn/HikvisionNetworkCameraSdkForCsharp
项目结构

├─Dlls/

├─Native/
│              HCNetSDK.cs

├─ CameraDevice.cs

...项目很简单,主要就提供了两个类:

[*]一个是CameraDevice.cs:相机API使用
主要接口和成员如图
https://img2023.cnblogs.com/blog/985540/202408/985540-20240813181656206-762260834.png
[*]HCNetSDK.cs:对C++的头文件的封装,包含常用的类型的声明等
(由官方提供的Demo进行修改,并小修小补,修复了部分Bug)
https://img2023.cnblogs.com/blog/985540/202408/985540-20240813181802392-1427812086.png
使用

拷贝动态链接库DLL

拷贝动态链接库到程序目次,或者程序能访问到的地方,内部运行时自动链接
这里有个巧妙地办法:使用情况变量
string originalPath = Environment.GetEnvironmentVariable("Path") ?? string.Empty;
originalPath = Regex.Replace(originalPath, "^" + Path.PathSeparator, string.Empty);
// 加入当前目录的bin
Environment.SetEnvironmentVariable("PATH", "bin" + Path.PathSeparator + originalPath);重点在Environment.SetEnvironmentVariable("PATH", ...),因为程序一般运行都会访问PATH情况变量
示例

// 初始化相机SDK,涉及非托管内存分配
CameraDevice.InitializeSdk();


string userName = "admin";
string password = "password";
string iP = "192.168.18.1";
ushort port = 8000;

// CameraDevice实现了IDisposable
using(CameraDevice camera = new(userName, password, iP, port)){
        try{
                // 需要登录才能使用, 阻塞
                camera.Login();
                Console.WriteLine("登录成功! {0}", camera.UserName);
        } catch (Exception e) {
                Console.WriteLine("exception: {0}", e);
                return;
        }

        try{
                // 直接从流中获取图片
                byte[] image = camera.DirectlyCaptureJpegImage();
                // ImageSharp
                Image<Rgb24> rgb24 = Image.Load<Rgb24>(image);
                // ...
        } catch(Exception e){
                Console.WriteLine("exception: {0}", e);
                return;
        }

        // 自己处理流数据 (使用回调,非阻塞)
        camera.StartFetchVideoStream((streamType, data) => {
                if(streamType == StreamType.Header) {
                        // ...
                } else if(streamType == StreamType.Body) {
                        // ...
                }
        });


        // 模拟进行其他任务
        Stopwatch stopwatch = Stopwatch.StartNew();
        while (stopwatch.ElapsedMilliseconds < 3000)
        {
                // ...
        }
}


// 程序运行结束,销毁SDK资源(非托管)
CameraDevice.CleanUpSdk();竣事语

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 海康网络相机C#封装库分享