由于公司项目需要,要通过Python取得海康相机识别到的车牌号,由于目前在办公室,无法进行实际测试,所以通过网络触发抓拍的方式来进行。
首先要下载海康官网的SDK示例,最开始从网上查找资料是通过swig进行编译成动态链接库然后再用Python进行调用,但是在将车牌号返回给Python时,一直没有办法进行正确的解码,返回的字符串也不完整,所以就放弃了用swig进行编译。
直接将代码编译成dll,再调可成功解码获得想要的信息。
Python环境3.5;C++编译环境vs2017。
C++代码为官方SDK文件(根据自己的系统下载http://www1.hikvision.com/cn/download_61.html——>>开发文档——>>编程指南(抓拍机)——>>4.2代码。
在弹出的窗口中按照下图所示选择
包含目录中加入XXX\CH-HCNetSDKV6.0.2.35_build20190411_Win64\include
库目录中加入XXX\CH-HCNetSDKV6.0.2.35_build20190411_Win64\lib
其他环境配置根据自己需要添加
将4.2的代码修改,并为项目加入头文件,头文件中为Python需要调用到的接口,如:
#pragma once
class Mytest
{
void init(char* ip, char* usr, char* password);
char* zhuapai();
void release();
};
在4.2代码中加入语句
#define DLLEXPORT extern "C" __declspec(dllexport)
其中init函数为
DLLEXPORT void init(char* ip, char* usr, char* password) {
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
OpenCamera(ip, usr, password);
InitializeCriticalSection(&g_cs_frameList);
hThread = ::CreateThread(NULL, 0, ReadCamera, NULL, 0, 0);
}
zhuapai函数为
DLLEXPORT char* zhuapai()
{
SetupAlarm();//布防
SetMessageCallBack(); //注册报警回调函数
Sleep(500);
//网络触发抓拍
NET_DVR_SNAPCFG struSnapCfg;
memset(&struSnapCfg, 0, sizeof(NET_DVR_SNAPCFG));
//结构体大小
struSnapCfg.dwSize = sizeof(NET_DVR_SNAPCFG);
//线圈抓拍次数,0-不抓拍,非 0-连拍次数,目前最大 5 次
struSnapCfg.bySnapTimes = 3;
//抓拍等待时间,单位 ms,取值范围[0,60000]
struSnapCfg.wSnapWaitTime = 1000;
//连拍间隔时间,单位 ms,取值范围[67,60000]
struSnapCfg.wIntervalTime[0] = 1000;
struSnapCfg.wIntervalTime[1] = 1000;
//触发 IO 关联的车道号,取值范围[0,9]
struSnapCfg.byRelatedDriveWay = 0;
//网络触发连拍
if (!NET_DVR_ContinuousShoot(lUserID, &struSnapCfg))
{
printf("NET_DVR_ContinuousShoot error, %d\n", NET_DVR_GetLastError());
}
//Sleep(5000);
////报警撤防
CloseAlarm();
return x;//x为车牌号,全局变量;
}
release函数为4.2代码中拿掉init函数和zhuapai函数代码的main函数。
编译生成dll文件后,即可调用。Python代码
import os
import time
import ctypes
dllPath = "xxx.dll"
pDll = ctypes.WinDLL(dllPath)
print(pDll)
ip = bytes('XXXXX', encoding='utf-8') #摄像头IP地址,要和本机IP在同一局域网
name = bytes('xxx', encoding='utf-8') #管理员用户名
pw = bytes('xxxx', encoding='utf-8') #管理员密码
pDll.init(ip, name, pw)
pDll.zhuapai.restype = ctypes.c_char_p
pResult = pDll.zhuapai()
print(pResult.decode('gb2312'))
Linux下用codeblock编译,步骤类似,网上相关资源也比较多,Python代码中将ctypes.WinDLL改为ctypes.CDLL即可。
有什么问题欢迎留言讨论,看到就会回复的。