Python调用海康SDK进行车牌识别(动态链接库的方法—不通过swig)

       由于公司项目需要,要通过Python取得海康相机识别到的车牌号,由于目前在办公室,无法进行实际测试,所以通过网络触发抓拍的方式来进行。

        首先要下载海康官网的SDK示例,最开始从网上查找资料是通过swig进行编译成动态链接库然后再用Python进行调用,但是在将车牌号返回给Python时,一直没有办法进行正确的解码,返回的字符串也不完整,所以就放弃了用swig进行编译。

        直接将代码编译成dll,再调可成功解码获得想要的信息。

        Python环境3.5;C++编译环境vs2017。

         C++代码为官方SDK文件(根据自己的系统下载http://www1.hikvision.com/cn/download_61.html——>>开发文档——>>编程指南(抓拍机)——>>4.2代码。

         vs2017新建项目,选择Windows新建向导

        在弹出的窗口中按照下图所示选择

包含目录中加入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即可。

有什么问题欢迎留言讨论,看到就会回复的。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值