前言:无人值守过磅摄像头拍照

        无人值守过程很重要的一个环节就是车辆过磅等车辆到到磅上指定位置后,触发车牌识别,以及车辆前后左右四个方位摄像头拍照,并存入到系统中。


一、支持设备:

        建议都采用600万像素以上的海康威视的抢形摄像头,地磅一般都处于户外,主要考虑恶劣的工作环境,相比球型摄像头,枪型更加适合了。

二、下载海康威视官方SDK:

1. 海康威视官网地址: 海康威视-引领智能物联新未来 (hikvision.com)

2. 服务支持-》下载中心-》SDK下载

python海康摄像头抓图 海康抓拍软件_python海康摄像头抓图

3. 选择合适的SDK版本,系统采用的.net开发那么肯定是选择win64的了。

python海康摄像头抓图 海康抓拍软件_System_02

4. 下载文件解压缩:

python海康摄像头抓图 海康抓拍软件_海康威视SDK_03

务必阅读txt文件,否则你调试时候会发现怎么都无法正常进行。

5. 注意事项:

1. 更新设备网络SDK时,SDK开发包【库文件】里的HCNetSDK.dll、HCCore.dll、HCNetSDKCom文件夹、libssl-1_1.dll、libcrypto-1_1.dll、hlog.dll、hpr.dll、zlib1.dll、PlayCtrl.dll、SuperRender.dll、AudioRender.dll等文件均要加载到程序里面,【HCNetSDKCom文件夹】(包含里面的功能组件dll库文件)需要和HCNetSDK.dll、HCCore.dll一起加载,放在同一个目录下,且HCNetSDKCom文件夹名不能修改。

        2. 如果自行开发软件不能正常实现相应功能,而且程序没有指定加载的dll库路径,请在程序运行的情况下尝试删除HCNetSDK.dll。如果可以删除,说明程序可能调用到系统盘Windows->System32目录下的dll文件,建议删除或者更新该目录下的相关dll文件;如果不能删除,dll文件右键选择属性确认SDK库版本。

        3. 如按上述步骤操作后还是不能实现相应功能,请根据NET_DVR_GetLastError返回的错误号判断原因。

三、官方Demo示例 

        官方提供了8个c#的示例,我们主要调用摄像头进行拍照,那么主要就是前面两个Demo是研究的重点了。

python海康摄像头抓图 海康抓拍软件_Text_04

四、调用SDK的方法

1. 直接把演示项目中的CHCNetSDK.cs 拷贝到项目中。

2. 按照前面的注意事项把库文件拷贝到debug目录下:

        否则无法进行调试。我这里用的.net 8 注意拷贝到debug目录下的net8.0-windows 中才可以使用

3.  首先需要定义一些类属性以及常量:

private uint iLastErr = 0;
private Int32 m_lUserID = -1;
private bool m_bInitSDK = false;
   private bool m_bRecord = false;
   private bool m_bTalk = false;
private Int32 m_lRealHandle = -1;
   private int lVoiceComHandle = -1;
   private string str;

   CHCNetSDK.REALDATACALLBACK RealData = null;
   CHCNetSDK.LOGINRESULTCALLBACK LoginCallBack = null;
   public CHCNetSDK.NET_DVR_PTZPOS m_struPtzCfg;
   public CHCNetSDK.NET_DVR_USER_LOGIN_INFO struLogInfo;
   public CHCNetSDK.NET_DVR_DEVICEINFO_V40 DeviceInfo;

4. 构造函数初始化SDK:        

m_bInitSDK = CHCNetSDK.NET_DVR_Init();
	if (m_bInitSDK == false)
	{
		MessageBox.Show("NET_DVR_Init error!");
		return;
	}
	else
	{
        //保存SDK日志 To save the SDK log
        CHCNetSDK.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);
	}

5. 登录设备:

private void Login(string ipAddress, string username, string password, string port = "8000")
    {

        struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();

        //设备IP地址或者域名
        byte[] byIP = System.Text.Encoding.Default.GetBytes(ipAddress);
        struLogInfo.sDeviceAddress = new byte[129];
        byIP.CopyTo(struLogInfo.sDeviceAddress, 0);

        //设备用户名
        byte[] byUserName = System.Text.Encoding.Default.GetBytes(username);
        struLogInfo.sUserName = new byte[64];
        byUserName.CopyTo(struLogInfo.sUserName, 0);

        //设备密码
        byte[] byPassword = System.Text.Encoding.Default.GetBytes(password);
        struLogInfo.sPassword = new byte[64];
        byPassword.CopyTo(struLogInfo.sPassword, 0);

        struLogInfo.wPort = ushort.Parse(port);//设备服务端口号
      

        struLogInfo.cbLoginResult = LoginCallBack;
        struLogInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是 

        DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40();

        //登录设备 Login the device
        m_lUserID = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo);
        if (m_lUserID < 0)
        {
            iLastErr = CHCNetSDK.NET_DVR_GetLastError();
            str = "NET_DVR_Login_V40 failed, error code= " + iLastErr; //登录失败,输出错误号
            MessageBox.Show(str);
            return;
        }

    }

6.  操作拍照:

string sJpegPicFileName;
  //图片保存路径和文件名 the path and file name to save
  sJpegPicFileName = "JPEG_test.jpg";

  int lChannel = 1; //通道号 Channel number

  CHCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new CHCNetSDK.NET_DVR_JPEGPARA();
  lpJpegPara.wPicQuality = 0; //图像质量 Image quality
  lpJpegPara.wPicSize = 0xff; //抓图分辨率 Picture size: 2- 4CIF,0xff- Auto(使用当前码流分辨率),抓图分辨率需要设备支持,更多取值请参考SDK文档

  //JPEG抓图 Capture a JPEG picture
  if (!CHCNetSDK.NET_DVR_CaptureJPEGPicture(m_lUserID, lChannel, ref lpJpegPara, sJpegPicFileName))
  {
      iLastErr = CHCNetSDK.NET_DVR_GetLastError();
      str = "NET_DVR_CaptureJPEGPicture failed, error code= " + iLastErr;
      MessageBox.Show(str);
      return;
  }
  else
  {
      str = "Successful to capture the JPEG file and the saved file is " + sJpegPicFileName;
      MessageBox.Show(str);
  }

总结:

        初次接触调用海康威视的sdk,看到CHCNetSDK上定义的常量就有些发怵,其实你不用去管他,直接copy过来,弄清楚整个调用的流程,首先定义一些需要用到的常量和属性,再就是构造函数上初始化sdk,第三步就是登录到设备,最后就是调用拍照的接口函数了。