海康威视网络摄像机的工具包的使用说明(C#)

一、下载SDK(这里需要注意是海康威视的网络摄像机)

在这里插入图片描述
下载SDK的地址:https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10&id=5cda5902f47ae80dd41a54b7

在这里插入图片描述

二、通过局域网IP查看摄像机的状况

在这里插入图片描述

三、 运行海康威视的DEMO,查看是否可执行,在运行之前需要明确摄像机的IP地址、确保计算机与摄像机处于同一局域网中的同一网段。

在这里插入图片描述
在这里插入图片描述

四、引入摄像头相关依赖到C#(这里我使用的是.Net Formwork)

首先需要将库文件中的部门驱动程序拷贝到程序的bin文件中
在这里插入图片描述

五、摄像机部分配置说明(以抓图为例)

  1. 在使用摄像机的部分功能之前,需要确定摄像机的配置
    在这里插入图片描述
  2. 定时抓图概述
    在这里插入图片描述

六、SDK开发C#代码示例及说明(以抓图为例)

  1. 网络摄像机相关的方法可查看SDK中的说明文档
    在这里插入图片描述
    2、C# 代码示例(以抓图为例)
    在这里插入图片描述
public class HIKVISION
{
    // 摄像头抓图处理的两种模式true为抓图到本地文件处理模式,false为本地直接处理模式
    // 抓图到本地文件,存在删除报文件占用问题
    // 现使用本地缓存直接处理模式
    private static bool captureMode = false;
    // 摄像头配置信息
    public static CameraInfoDAO config = null;
    /// <summary>
    /// 摄像头登录信息
    /// </summary>
    class CameraUser
    {
        public string baseAddress = "";
        public string username = "";
        public string password = "";
    }
    class TSInfo
    {
        // 缓存的数据
        public List<Hashtable> imageValues = new List<Hashtable>();
        // 缓存的处理数据
        public List<Hashtable> imageMathValues = new List<Hashtable>();
        // 开始采集抓图之后的计数
        public double order = 0;
        // 抓图保存的数据库
        public string imageDBName = "";
        // 抓图处理后的数据库
        public string imageMathDBName = "";
        // 是否保存单图数据库中
        public bool isStorage = false;
        // 是否保存单位时间处理,下发数据
        public bool isTimeStorage = false;
    }
    class imageInfo
    {
        // 用于标识是否正在抓取图
        public bool isGrabbing = false;
        // 是否为登录状态
        public int loginHandle = -1;
        // fileIndex用于避免删除图片失败照成的卡顿
        public int fileIndex = 0;
    }
    class taskDataInfo
    {
        // 煤量累计值
        public double coalAll = 0;
        // 开始采集时间
        public DateTime startTime;
        // 创建抓图任务(采集),任务信息
        public TaskDAO taskInfo;
        // 是否为计时任务
        public bool isTimeStatus = false;
        // 计时时间
        public double timeLongInfo = 0;
    }
    // 原始图片存储路径
    private static string path = RelatedFile.RelatedPath("HIKVISION\\image");
    // 任务信息
    static taskDataInfo taskData = new taskDataInfo();
    // 时序数据库存储信息
    private static TSInfo TSData = new TSInfo();
    // 摄像头登录信息
    private static CameraUser cameraInfo = new CameraUser();
    // 图片信息
    private static imageInfo imageData = new imageInfo();
    // 配置参数调用相机信息
    private static CameraInfoDAO cameraConfigInfo = new CameraInfoDAO();
    public static void Init()
    {
        Task.Factory.StartNew(startImg, TaskCreationOptions.LongRunning);
    }
    private static void InitSDKFile()
    {
        // 初始化 SDK
        bool initResult = NET_DVR_Init();
        if (!initResult)
        {
            Log.logger.Error("SDK 初始化失败!");
            throw new Exception("SDK 初始化失败_010");
        }
        // 登录设备
        NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();
        cameraInfo = new CameraUser();
        // TODO 参数检查
        cameraInfo.baseAddress = config.cameraIp;
        cameraInfo.username = config.cameraUserName;
        cameraInfo.password = config.cameraPassword;
        imageData.loginHandle = NET_DVR_Login_V30(cameraInfo.baseAddress, config.cameraPort, cameraInfo.username, cameraInfo.password, ref deviceInfo);
        if (imageData.loginHandle < 0)
        {
            Log.logger.Error("海康威视登录失败");
            NET_DVR_Cleanup();
            throw new Exception("摄像头处于未登录状态_010");
        }
    }
    private async static Task startImg()
    {
        try
        {
            while (true)
            {
                if (imageData.isGrabbing && imageData.loginHandle >= 0)
                {
                    // 抓取图片
                    NET_DVR_JPEGPARA jpegPara = new NET_DVR_JPEGPARA();
                    jpegPara.wPicQuality = config.wPicQuality; // 图片质量,范围为0-6,其中0表示最好,6表示最差
                    jpegPara.wPicSize = config.wPicSize; ; // 图片大小,0表示最优
                    string savePath = "";
                    int bufferSize = 524288; // 替换为你期望的图像数据缓冲区大小 1M = 1024 * 1024
                    byte[] jpegBuffer = new byte[bufferSize];
                    byte[] binaryImageData = new byte[bufferSize / 2];
                    uint sizeReturned = 0;
                    bool result = false;
                    var imageValue = -1.0;
                    if (captureMode)
                    {
                        savePath = path + "\\" + Utils.formatHRealTime(DateTime.Now) + ".jpeg";
                        result = NET_DVR_CaptureJPEGPicture(imageData.loginHandle, 1, ref jpegPara, savePath);
                        // 使图片不过度堆积,存在问题
                        setImageFile();
                        imageValue = await image.DoubleVImgAForgeFile(savePath);
                    }
                    else {
                        //var ticks = DateTime.Now.Ticks;
                        result = NET_DVR_CaptureJPEGPicture_NEW(imageData.loginHandle, 1, ref jpegPara, jpegBuffer, (uint)bufferSize,ref sizeReturned);
                        //Log.logger.Info("图片抓取时间 " + (DateTime.Now - new DateTime(ticks)).TotalMilliseconds);
                        //result = NET_DVR_GetFrame_NEW(imageData.loginHandle, 1, ref jpegPara, jpegBuffer, (uint)bufferSize, ref sizeReturned);
                        Tuple<byte[], double> resultImage = await image.DoubleVImgAForgeByte(jpegBuffer, config.median, config.isfile, path + "\\" + taskData.taskInfo.taskName +  "\\" + TSData.order + ".jpeg");
                        binaryImageData = resultImage.Item1;
                        imageValue = Math.Round(resultImage.Item2, 5); ;
                    }
                    if (!result)
                    {
                        var code = NET_DVR_GetLastError();
                        Log.logger.Error("图片抓取失败,错误码:" + code);
                    }
                    // 此处需要确定比例与煤炭重量间的关系
                    taskData.coalAll = taskData.coalAll + imageValue * 1.153;
                    TSData.imageValues.Add(new Hashtable()
                    {
                        { "imageValue", imageValue },
                        { "order", TSData.order},
                    });
                    // 将数据保存到任务文件夹
                    // { "image", Convert.ToBase64String(binaryImageData)}
                    TSSaveData();
                    // 避免缓存堆积
                    if (TSData.imageMathValues.Count > 20)
                    {
                        TSData.imageMathValues.RemoveAt(0);
                    }
                    var wsInfoPush = new WSPush();
                    // 推送的部分数据暂时未处理
                    wsInfoPush.nowStatus = true;
                    wsInfoPush.nowModel = true;
                    wsInfoPush.isStroage = TSData.isStorage;
                    wsInfoPush.isTimeStroage = TSData.isTimeStorage;
                    wsInfoPush.openTime = TSData.order;
                    wsInfoPush.cameraHZ = 1;
                    wsInfoPush.coalAll = taskData.coalAll;
                    wsInfoPush.nowImage = jpegBuffer;
                    wsInfoPush.nowDoubleImage = binaryImageData;
                    wsInfoPush.imageValue = imageValue;
                    var wsInfo = new Dictionary<string, WSPush>() {
                        { "taskInfo",wsInfoPush  }
                    };
                    WS.broadcast("user", Utils.toJSON(wsInfo));
                    // 计时任务处理逻辑
                    if (taskData.isTimeStatus)
                    {
                        var dataNow = DateTime.Now;
                        TimeSpan timeDifference = dataNow - taskData.startTime;
                        double hours = timeDifference.TotalHours;
                        if (hours >= taskData.timeLongInfo)
                        {
                            stopScreenshot();
                        }
                    }
                    TSData.order++;
                }
                else
                {
                    var wsInfoPush = new WSPush();
                    // 推送的部分数据暂时未处理
                    wsInfoPush.nowStatus = false;
                    wsInfoPush.nowModel = false;
                    wsInfoPush.isStroage = false;
                    wsInfoPush.isTimeStroage = false;
                    wsInfoPush.openTime = 0;
                    wsInfoPush.cameraHZ = 0;
                    wsInfoPush.coalAll = taskData.coalAll;
                    var wsInfo = new Dictionary<string, WSPush>() {
                        { "taskInfo",wsInfoPush  }
                    };
                    WS.broadcast("user", Utils.toJSON(wsInfo));
                    System.Threading.Thread.Sleep(1000);
                }
            }
        }
        catch (Exception ex)
        {
            imageData.isGrabbing = false;
            Log.logger.Error(Utils.LogTxtString(ex, "海康威视摄像机处理失败"));
        }
    }
}
  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 海康威视是一家专业从事视频监控设备研发、生产和销售的公司,其网络摄像机是其中产品线的一部分。Delphi是一款流行的编程语言和集成开发环境,通常用于软件开发。海康威视网络摄像机可以与Delphi编程语言和开发环境相结合使用海康威视网络摄像机可以通过网络连接到计算机或其他设备,实时传输视频图像和音频数据。在Delphi开发环境中,可以使用相关的SDK(软件开发工具包)和API(应用程序接口)来与网络摄像机进行通信和控制。开发人员可以使用Delphi的图形用户界面设计和编程能力来创建自定义的监控系统和应用程序。 使用Delphi编程语言和海康威视网络摄像机,开发人员可以实现诸如视频监控、安防系统、智能识别等功能。他们可以通过Delphi编写代码来实现图像捕获、视频录制、云存储等操作。同时,Delphi提供了丰富的图形库和控件,使开发人员能够轻松创建用户友好的监控系统界面。 总而言之,海康威视网络摄像机与Delphi编程语言的结合,使开发人员能够利用Delphi的编程能力和海康威视摄像机技术,开发出功能强大且用户友好的视频监控系统和应用程序。这种组合提供了一种灵活、高效的解决方案,用于满足各种视频监控需求。 ### 回答2: 海康威视是一家领先的网络摄像机制造商,也是全球领先的视频监控解决方案提供商之一。它为各种行业和场所提供各种网络摄像机,如监控摄像机、无线摄像机、高清摄像机等。 Delphi是一种编程语言,用于创建跨平台的桌面、移动和云端应用程序。开发人员可以使用Delphi编写各种应用程序,包括视频监控应用程序。 海康威视网络摄像机可以与Delphi集成,使开发人员能够使用Delphi编写视频监控应用程序。开发人员可以通过调用海康威视的API,实现与网络摄像机的通信和控制。这意味着开发人员可以使用Delphi来实现视频监控应用程序中的各种功能,例如实时视频流的显示、录制、回放和报警等。 Delphi还提供了丰富的图形界面设计工具和组件库,使开发人员能够轻松创建用户友好的视频监控应用程序界面。开发人员可以利用这些工具和组件来设计和管理海康威视网络摄像机的布局、配置和控制界面。 总之,通过海康威视网络摄像机和Delphi的结合,开发人员可以创建功能强大、用户友好的视频监控应用程序,为各种行业和场所提供安全保障和监控解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落雪寒窗-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值