本文主要是介绍拌合楼管理系统(十七)海康威视车牌识别摄像头手工控制拍照和车牌识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言:
一般海康威视的车牌都是通过设置触发线,车辆经过某个位置后,触发摄像头的拍照和车牌识别的功能。做得更精细一些会通过雷达感应线圈。在拌合楼这个项目过程中,有需要程序控制摄像头来进行拍照和车牌识别。
实现过程:
一、实际效果:
我打印了一张图片放在摄像头前,模拟车停好位置。一个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文档了。
这篇关于拌合楼管理系统(十七)海康威视车牌识别摄像头手工控制拍照和车牌识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!