由于公司项目需要,要通过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即可。
有什么问题欢迎留言讨论,看到就会回复的。
由于公司项目需要,要通过Python取得海康相机识别到的车牌号,由于目前在办公室,无法进行实际测试,所以通过网络触发抓拍的方式来进行。 首先要下载海康官网的SDK示例,最开始从网上查找资料是通过swig进行编译成动态链接库然后再用Python进行调用,但是在将车牌号返回给Python时,一直没有办法进行正确的解码,返回的字符串也不完整,所以就放弃了用swig进行编译...
记一篇数字图像课程的实训
基于opencv-python的车牌识别,代码主要参考CSDN上几个版主的代码,对代码进行了一定的优化,一定程度上提高了识别的准确率。并重写了一个GUI界面,添加数据导出功能。
完整工程使用的模块如下:
主要模块:cv2
GUI 界面:PyQt5
其他模块:numpy os json time
基本实现流程:
使用cv2.imdecode()函数将图片文件转...
搜罗了网上一些关于如何在python中实现海康威视相机的连接与画面播放的资料,最直接的方式是通过rtsp流来实现。
海康的rtsp协议格式如下(参考:海康相机使用RTSP):
rtsp://[username]:[passwd]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
rtsp://admin:12345@192.168....
Python语言具有广泛的应用范围,其中涉及到海康SDK实时预览opencv也是很常见的一种应用方式。Python调用海康SDK实时预览opencv有以下步骤:
1. 安装海康SDK
首先需要在官网下载并安装海康SDK,并在安装后把SDK自带的头文件和库文件放到自己的项目目录下。
2. 安装OpenCV
需要在本地安装好OpenCV,并确保可以在python中调用OpenCV。
3. 编写Python程序
在python中编写程序,首先需要导入海康SDK的相关库,如海康SDK的头文件和库文件。以Python2为例,代码如下:
import os
import sys
import datetime
import time
import cv2
from HCNetSDK import *
4. 初始化海康SDK
在Python程序中通过NET_DVR_Init()函数初始化海康SDK,这个函数需要在使用海康SDK的任何其他函数之前调用。
5. 登录设备
登录设备可以通过NET_DVR_Login_V30()函数实现,其中需要传入设备IP地址、端口号、用户名和密码等参数。
6. 获取实时预览
通过NET_DVR_RealPlay_V30()函数获取实时预览图像。该函数需要传入设备登录ID、预览窗口句柄等参数,可以使用OpenCV在窗口中显示图像。
7. 停止预览和退出登录
在程序结束时需要通过NET_DVR_StopRealPlay()和NET_DVR_Logout()函数停止预览和退出登录。
以上就是Python调用海康SDK实时预览opencv的基本流程。在实际应用中,可以根据需要进行调整和完善。
RuntimeError: Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead.
12156