问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C# 上位机之海康相机开发(SDK)实战教程

创作时间:
作者:
@小白创作中心

C# 上位机之海康相机开发(SDK)实战教程

引用
1
来源
1.
https://www.shaoqun.com/a/2596389.html

在很多工业自动化、机器视觉、安防监控等领域,海康威视(Hikvision)提供的相机在图像采集和视频处理方面有着广泛的应用。作为开发者,我们常常需要将这些设备与上位机软件进行集成,实现图像采集、处理和保存等功能。

海康威视提供了完善的开发工具包(SDK),方便我们在C#等语言中进行二次开发,特别是在Windows平台上。本文将介绍如何在C#中使用海康威视的SDK进行相机操作,包括连接相机、获取图像、显示图像等基础功能。

1. 准备工作:安装海康SDK

在开始开发之前,首先需要准备开发环境和安装海康威视的SDK。海康威视的SDK可以在其官网或者通过技术支持获取。

步骤 1:下载海康SDK

  • 登录海康威视官网:海康官网
  • 在 "开发者中心" 或 "SDK下载" 页面,下载适合你的开发环境的 SDK 包。

下载完毕后,你将得到一个压缩包,解压后会看到SDK的相关文件夹,包括API文档、示例代码和DLL动态链接库。

步骤 2:添加SDK依赖

在C#项目中,你需要引用海康SDK的DLL文件,通常包括:

  • HCNetSDK.dll
  • PlayCtrl.dll
  • CommCtrl.dll

将这些DLL文件添加到项目中(将DLL文件复制到项目目录,或者通过项目的 "引用" 添加)。

2. SDK基本概念与使用方法

海康SDK为C#开发提供了接口函数,主要的操作包括:

  • 初始化SDK:初始化SDK资源,通常在开始时需要调用。
  • 连接设备:通过设备的IP地址、端口号、用户名和密码连接设备。
  • 视频流捕获:从相机获取视频流并显示。
  • 图像抓取:定时或按需获取静态图像。
  • 断开连接:操作完成后,释放SDK资源。

常见的SDK操作流程如下:

  1. 初始化SDK。
  2. 连接设备。
  3. 启动视频流。
  4. 获取视频数据。
  5. 显示视频或图像。
  6. 断开连接,释放资源。

3. C#开发海康相机接口的基本步骤

以下是一个简单的示例,展示如何在C#中使用海康威视的SDK进行图像采集和显示。

步骤 1:初始化SDK

在程序启动时,首先需要调用海康SDK的初始化函数。

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace HikvisionCamera
{
    public partial class MainForm : Form
    {
        // 导入海康SDK的DLL
        [DllImport("HCNetSDK.dll")]
        private static extern bool NET_DVR_Init();

        [DllImport("HCNetSDK.dll")]
        private static extern bool NET_DVR_Cleanup();

        public MainForm()
        {
            InitializeComponent();
        }

        // 初始化SDK
        private void InitializeSDK()
        {
            bool success = NET_DVR_Init();
            if (success)
            {
                MessageBox.Show("SDK初始化成功");
            }
            else
            {
                MessageBox.Show("SDK初始化失败");
            }
        }

        // 释放SDK资源
        private void CleanupSDK()
        {
            NET_DVR_Cleanup();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            InitializeSDK();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            CleanupSDK();
        }
    }
}

代码说明:

  • 使用 NET_DVR_Init 初始化海康SDK。
  • 在程序退出时,调用 NET_DVR_Cleanup 清理资源,释放SDK占用的内存和句柄。

步骤 2:连接设备

通过SDK提供的接口连接海康相机,通常需要设备的IP地址、端口号、用户名和密码。

[DllImport("HCNetSDK.dll")]
private static extern int NET_DVR_Login_V30(string ip, ushort port, string username, string password, ref NET_DVR_DEVICEINFO_V30 deviceInfo);

[DllImport("HCNetSDK.dll")]
private static extern bool NET_DVR_Logout_V30(int userID);

private int m_lUserID = -1; // 用户ID
private NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();

private void LoginToDevice()
{
    string ip = "192.168.1.100";
    ushort port = 8000;
    string username = "admin";
    string password = "12345";

    m_lUserID = NET_DVR_Login_V30(ip, port, username, password, ref deviceInfo);
    if (m_lUserID < 0)
    {
        MessageBox.Show("设备连接失败");
    }
    else
    {
        MessageBox.Show("设备连接成功");
    }
}

private void LogoutFromDevice()
{
    if (m_lUserID >= 0)
    {
        NET_DVR_Logout_V30(m_lUserID);
        m_lUserID = -1;
    }
}

代码说明:

  • NET_DVR_Login_V30:登录设备,返回用户ID。
  • NET_DVR_Logout_V30:注销设备,释放连接。

步骤 3:获取视频流并显示

获取视频流并通过SDK显示图像,通常会用到 NET_DVR_RealPlay_V30 方法。

[DllImport("HCNetSDK.dll")]
private static extern int NET_DVR_RealPlay_V30(int userID, ref NET_DVR_CLIENTINFO clientInfo, IntPtr hWnd, bool block);

private void StartVideoStream()
{
    if (m_lUserID < 0)
    {
        MessageBox.Show("请先登录设备");
        return;
    }

    NET_DVR_CLIENTINFO clientInfo = new NET_DVR_CLIENTINFO();
    clientInfo.lChannel = 1; // 通道号,通常是1
    clientInfo.hPlayWnd = videoPanel.Handle; // 显示视频的面板句柄

    int realPlayHandle = NET_DVR_RealPlay_V30(m_lUserID, ref clientInfo, IntPtr.Zero, true);
    if (realPlayHandle < 0)
    {
        MessageBox.Show("视频流启动失败");
    }
    else
    {
        MessageBox.Show("视频流启动成功");
    }
}

代码说明:

  • NET_DVR_RealPlay_V30:开始实时视频流播放。
  • clientInfo 包含通道号和显示视频的窗口句柄。

步骤 4:获取静态图像

除了视频流外,还可以使用 NET_DVR_CaptureJPEGPicture 方法来抓取相机的静态图像。

[DllImport("HCNetSDK.dll")]
private static extern bool NET_DVR_CaptureJPEGPicture(int userID, int channel, ref NET_DVR_JPEGPARA jpegPara, string fileName);

private void CaptureImage()
{
    if (m_lUserID < 0)
    {
        MessageBox.Show("请先登录设备");
        return;
    }

    NET_DVR_JPEGPARA jpegPara = new NET_DVR_JPEGPARA();
    jpegPara.wPicSize = 2; // 设置图片质量
    jpegPara.wPicQuality = 0; // 设置图片大小

    string fileName = @"C:\CapturedImage.jpg";
    bool success = NET_DVR_CaptureJPEGPicture(m_lUserID, 1, ref jpegPara, fileName);
    if (success)
    {
        MessageBox.Show("图片抓取成功");
    }
    else
    {
        MessageBox.Show("图片抓取失败");
    }
}

代码说明:

  • NET_DVR_CaptureJPEGPicture:捕获静态图像并保存为JPEG文件。

4. 常见问题与调试技巧

  1. 相机无法连接:确认相机的IP地址、端口、用户名和密码是否正确,且设备是否与PC处于同一网络。
  2. 视频流显示不正常:确保窗口句柄传递正确,显示面板的尺寸足够容纳视频。
  3. API调用返回负值:海康SDK通常返回负值表示失败。调用 NET_DVR_GetLastError 获取详细错误信息。

5. 总结与拓展

本文介绍了如何在C#中使用海康威视的SDK进行相机操作,包括相机连接、视频流显示和图像抓取等基本功能。通过SDK的接口,开发者可以轻松地将海康威视相机集成到自己的应用中,满足不同的需求。

未来你可以进一步拓展功能,例如:

  • 实现多通道视频流显示。
  • 图像处理(如人脸识别、物体检测等)。
  • 支持录像和回放功能。

海康威视的SDK是一个强大且灵活的工具,结合C#的开发,可以实现各种复杂的图像采集与处理功能,助力开发者构建高效的视觉系统。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号