拌合楼管理系统(十七)海康威视车牌识别摄像头手工控制拍照和车牌识别

本文详细描述了使用C#编程控制海康威视车牌识别摄像头的过程,包括初始化、登录设备、配置参数、车牌识别方式和网络触发抓拍,以及相关SDK接口的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

        一般海康威视的车牌都是通过设置触发线,车辆经过某个位置后,触发摄像头的拍照和车牌识别的功能。做得更精细一些会通过雷达感应线圈。在拌合楼这个项目过程中,有需要程序控制摄像头来进行拍照和车牌识别。


实现过程:

        一、实际效果:

        我打印了一张图片放在摄像头前,模拟车停好位置。一个winForm,上面按钮点击后就控制拍照和车牌识别,车牌识别的结果通过一个lable显示出来,场景大图和车牌小图,分别通过两个pictureBox显示出来。

        二、官方文档对于车牌识别的说明:

1. 初始化

        初始化NET_DVR_Init接口在程序开始是调用,只需要调用一次。

2. 登录设备

        用户注册即登录设备,调用NET_DVR_Login_V40接口,每一台设备只需要登录一次。

3. 获取设备能力,此步骤可以省略

        登录设备之后,可以通过NET_DVR_GetDeviceAbility获取智能交通能力集可以判断设备是否支持相关功能,能力集类型:DEVICE_ABILITY_INFO,能力集:ITDeviceAbility,节点:<ITCAbility>。

4.  车牌识别的方式

        车牌识别包括IO触发、虚拟线圈触发等自动触发抓拍模式和网络触发等手动抓拍模式。如果是自动触发模式,一般建议通过WEB网页登录设备进行配置调试,也可以通过SDK接口进行配置,相关接口:NET_DVR_GetDVRConfig(命令:NET_ITC_GET_TRIGGERCFG)、NET_DVR_SetDVRConfig(命令:NET_ITC_SET_TRIGGERCFG)、NET_DVR_GetDeviceConfig(命令:NET_DVR_GET_TRIGGEREX_CFG)、NET_DVR_SetDeviceConfig(命令:NET_DVR_SET_TRIGGEREX_CFG)等。
        如果是手动抓拍,有两种方式:1)通过NET_DVR_ManualSnap可以在接口直接返回结果信息;2)通过NET_DVR_ContinuousShoot发送网络触发连拍命令,抓拍结果跟自动触发模式一样,通过报警布防方式在报警回调函数里面返回。

5. 参数配置

        配置好设备相关参数,车辆通过时进行抓拍和识别,结果信息通过报警布防方式获取,具体实现方法:1) 先调用NET_DVR_SetDVRMessageCallBack_V50设置报警回调函数(V31、V30接口也支持,新接口兼容老接口),在SDK初始化之后即可以调用,多台设备对接时也只需要调用一次设置一个回调函数,回调函数里面接收数据之后可以通过报警设备信息(NET_DVR_ALARMER)中lUserID等参数判断区分设备。2) 每台设备分别登录,分别调用NET_DVR_SetupAlarmChan_V41进行布防,布防即建立设备跟客户端之间报警上传的连接通道,这样设备发生报警之后通过该连接上传报警信息,SDK在报警回调函数中接收和处理报警信息数据即可。对接智能交通摄像机,布防时可以选择布防等级,一级布防(byLevel为0)最大连接数为1个,二级布防(byLevel为1)最大连接数为3个,如果已经达到上限了,再布防就会失败,SDK将返回28的错误号。3) 程序退出前或者不需要接收报警信息时调用NET_DVR_CloseAlarmChan_V30进行撤防,释放资源,此时连接断开,设备将不再上传报警信息。

6.  车牌识别的告警类型:

        车牌识别的报警信息类型为COMM_ITS_PLATE_RESULT(新报警信息)和COMM_UPLOAD_PLATE_RESULT(老报警信息),分别对应接口NET_DVR_SetupAlarmChan_V41中布防参数byAlarmInfoType=1和byAlarmInfoType=0。建议使用新的报警信息类型。
        1)设备是否支持新报警信息可从注册返回的能力获知,详见NET_DVR_DEVICEINFO_V30结构中bySupport1&0x80(表示是否支持车牌新报警信息),如果注册返回能力不支持,设备仅支持老报警信息上传。2)COMM_UPLOAD_PLATE_RESULT:兼容旧型号(976/986/966等)抓拍机,一次回调只上传一张图片信息,对应报警信息结构体:NET_DVR_PLATE_RESULT。3)COMM_ITS_PLATE_RESULT:应用于违章图片组一次性上传以及合成图片上传等新功能,对应报警信息结构体:NET_ITS_PLATE_RESULT

7. 退出登录释放资源

        退出程序时调用NET_DVR_Logout注销设备,每一台设备调用一次。最后调用NET_DVR_Cleanup释放SDK所有资源。

         三、代码的实现

        对于如何登录、布防一级识别后图片的处理,可以详见我之前的文章。今天代码的核心呢空是如何点击按钮触发拍照和车牌识别了。拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,总算是跑通了。-CSDN博客

        1.  函数 NET_DVR_ContinuousShoot

              查阅sdk文档可以知道通过此寒暑可以进行网络触发抓拍。

BOOL NET_DVR_ContinuousShoot(

        LONG lUserID,

         LPNET_DVR_SNAPCFG lpInter

);

        其中IUserID 是设备登录后返回的句柄。 lpInter 是网络触发抓怕的配置

        2. 结构体  LPNET_DVR_SNAPCFG

struct{

DWORD dwSize;

BYTE byRelatedDriveWay;

BYTE bySnapTimes;

WORD wSnapWaitTime;

WORD wIntervalTime[MAX_INTERVAL_NUM];

DWORD dwSnapVehicleNum;

NET_DVR_JPEGPARA struJpegPara;

BYTE byRes2[16];

}

NET_DVR_SNAPCFG, *LPNET_DVR_SNAPCFG;

        代码是很简单的,但是大量时间都花在了对这个结构体的构造上。结构体的字段含义如下:

dwSize

结构体大小

byRelatedDriveWay

触发IO关联的车道号,取值范围[0,9]

bySnapTimes

线圈抓拍次数,0-不抓拍,非0-连拍次数,目前最大5次

wSnapWaitTime

抓拍等待时间,单位ms,取值范围[0,60000]

wIntervalTime

连拍间隔时间,单位ms,取值范围[67,60000]

dwSnapVehicleNum

抓拍车辆序号,从1开始,逐次递增

struJpegPara

抓拍图片参数,需要设备支持(参数取值范围由设备能力集为准),目前门禁考勤一体机V1.1支持

byRes2

保留,置为0

        3.  NET_DVR_JPEGPARA   JPEG图像信息结构体。

 struct{

WORD wPicSize;

WORD wPicQuality;

}NET_DVR_JPEGPARA,*LPNET_DVR_JPEGPARA;

wPicSize

图片尺寸:0-CIF(352*288/352*240),1-QCIF(176*144/176*120),2-4CIF(704*576/704*480)或D1(720*576/720*486),3-UXGA(1600*1200), 4-SVGA(800*600),5-HD720P(1280*720),6-VGA(640*480),7-XVGA(1280*960),8-HD900P(1600*900),9-HD1080P(1920*1080),10-2560*1920, 11-1600*304,12-2048*1536,13-2448*2048,14-2448*1200,15-2448*800,16-XGA(1024*768),17-SXGA(1280*1024),18-WD1(960*576/960*480), 19-1080I(1920*1080),20-576*576,21-1536*1536,22-1920*1920,23-320*240,24-720*720,25-1024*768,26-1280*1280,27-1600*600, 28-2048*768,29-160*120,75-336*256,78-384*256,79-384*216,80-320*256,82-320*192,83-512*384,127-480*272,128-512*272, 161-288*320,162-144*176,163-480*640,164-240*320,165-120*160,166-576*720,167-720*1280,168-576*960,180-180*240, 181-360*480, 182-540*720, 183-720*960, 184-960*1280, 185-1080*1440, 500-384*288, 0xff-Auto(使用当前码流分辨率)

wPicQuality

图片质量系数:0-最好,1-较好,2-一般

        4.  按钮事件的实现

        弄明白了两个结构体的构造,代码实现就是小意思了。

  NET_DVR_SNAPCFG nds = new NET_DVR_SNAPCFG();
  NET_DVR_JPEGPARA ndj = new NET_DVR_JPEGPARA();
  nds.byRelatedDriveWay =0;
  nds.bySnapTimes = 1;
  nds.wSnapWaitTime = 1000;
 
  ndj.wPicQuality = 0;
  ndj.wPicSize = 9;
  nds.struJpegPara = ndj;
  nds.byRes2 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

  nds.dwSize = (uint)Marshal.SizeOf(nds);


  if (!NET_DVR_ContinuousShoot(m_lUserID, ref nds))
  {

      myLogger.Error(NET_DVR_GetLastError());

  }
  else {
      myLogger.Info("手工触发车牌识别程序");
  }

    


        总结:

        官方文档示例主要是c来实现的,没跑通之前我都差不多要放弃了。但最后跑通的一刻感觉心情无比畅快,就想打仗攻克了一个又一个的山头。一个收获就是反复看官方的sdk文档了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT大灰狼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值