车牌识别C#项目源码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
public class VzClientSDK
{
public VzClientSDK()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
//设置回调函数时需要制定的类型
public enum VZ_LPRC_CALLBACK_TYPE : uint
{
VZ_LPRC_CALLBACK_COMMON_NOTIFY = 0, //SDK通用信息反馈
VZ_LPRC_CALLBACK_PLATE_STR, //车牌号码字符
VZ_LRPC_CALLBACK_FULL_IMAGE, //完整图像
VZ_LPRC_CALLBACK_CLIP_IMAGE, //截取图像
VZ_LPRC_CALLBACK_PLATE_RESULT, //实时识别结果
VZ_LPRC_CALLBACK_PLATE_RESULT_STABLE, //稳定识别结果
VZ_LPRC_CALLBACK_PLATE_RESULT_TRIGGER, //触发的识别结果,包括API(软件)和IO(硬件)方式的
VZ_LPRC_CALLBACK_VIDEO, //视频帧回调
}
//通用信息反馈类型
public enum VZ_LPRC_COMMON_NOTIFY : uint
{
VZ_LPRC_NO_ERR = 0,
VZ_LPRC_ACCESS_DENIED, //用户名密码错误
VZ_LPRC_NETWORK_ERR, //网络连接故障
}
//识别结果的类型
public enum VZ_LPRC_RESULT_TYPE : uint
{
VZ_LPRC_RESULT_REALTIME = 0, //实时识别结果
VZ_LPRC_RESULT_STABLE, //稳定识别结果
VZ_LPRC_RESULT_FORCE_TRIGGER, //调用“VzLPRClient_ForceTrigger”触发的识别结果
VZ_LPRC_RESULT_IO_TRIGGER, //外部IO信号触发的识别结果
VZ_LPRC_RESULT_VLOOP_TRIGGER, //虚拟线圈触发的识别结果
}
//顶点定义
//X_1000和Y_1000的取值范围为[0, 1000];
//即位置信息为实际图像位置在整体图像位置的相对尺寸;
//例如X_1000 = x*1000/win_width,其中x为点在图像中的水平像素位置,win_width为图像宽度
[StructLayout(LayoutKind.Sequential)]
public struct VZ_LPRC_VERTEX
{
uint X_1000;
uint Y_1000;
}
public const int VZ_LPRC_VIRTUAL_LOOP_NAME_LEN = 32;
public const int VZ_LPRC_VIRTUAL_LOOP_VERTEX_NUM = 4;
//虚拟线圈信息定义
[StructLayout(LayoutKind.Sequential)]
public struct VZ_LPRC_VIRTUAL_LOOP
{
public byte byID; //序号
public byte byEnable; //是否有效
public byte byDraw; //是否绘制
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 1, ArraySubType = UnmanagedType.I1)]
public byte[] byRes; //预留
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = VZ_LPRC_VIRTUAL_LOOP_NAME_LEN, ArraySubType = UnmanagedType.I1)]
public char[] strName;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = VZ_LPRC_VIRTUAL_LOOP_VERTEX_NUM)]
public VZ_LPRC_VERTEX[] struVertex; //顶点数组
}
public const int VZ_LPRC_VIRTUAL_LOOP_MAX_NUM = 8;
//虚拟线圈序列
[StructLayout(LayoutKind.Sequential)]
public struct VZ_LPRC_VIRTUAL_LOOPS
{
public uint uNumVirtualLoop; //实际个数
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = VZ_LPRC_VIRTUAL_LOOP_MAX_NUM)]
public VZ_LPRC_VIRTUAL_LOOP[] struLoop;
}
public const int VZ_LPRC_PROVINCE_STR_LEN = 128;
//预设省份信息
[StructLayout(LayoutKind.Sequential)]
public struct VZ_LPRC_PROVINCE_INFO
{
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = VZ_LPRC_PROVINCE_STR_LEN, ArraySubType = UnmanagedType.I1)]
public char[] strProvinces; //所有支持的省份简称构成的字符串
int nCurrIndex; //当前的预设省份的序号,在strProvinces中的,-1为未设置
}
[StructLayout(LayoutKind.Sequential)]
public struct TH_RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[StructLayout(LayoutKind.Sequential)]
public struct TH_PlateResult
{
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 16, ArraySubType = System.Runtime.InteropServices.UnmanagedType.I1)]
public char[] license; // 车牌号码
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = System.Runtime.InteropServices.UnmanagedType.I1)]
public char[] color; // 车牌颜色
public int nColor; // 车牌颜色序号
public int nType; // 车牌类型
public int nConfidence; // 车牌可信度
public int nBright; // 亮度评价
public int nDirection; // 运动方向,0 unknown, 1 left, 2 right, 3 up , 4 down
public TH_RECT rcLocation; //车牌位置
public int nTime; //识别所用时间
public byte nCarBright; //车的亮度
public byte nCarColor; //车的颜色
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 102, ArraySubType = System.Runtime.InteropServices.UnmanagedType.I1)]
public char[] reserved; // 保留
}
[StructLayout(LayoutKind.Sequential)]
public struct VzYUV420P
{
public IntPtr pY;
public IntPtr pU;
public IntPtr pV;
int widthStepY;
int widthStepU;
int widthStepV;
int width;
int height;
}
//图像信息
[StructLayout(LayoutKind.Sequential)]
public struct VZ_LPRC_IMAGE_INFO
{
public uint uWidth;
public uint uHeight;
public uint uPitch;
public uint uPixFmt;
public IntPtr pBuffer;
}
//设备序列号
[StructLayout(LayoutKind.Sequential)]
public struct VZ_DEV_SERIAL_NUM
{
public uint uHi;
public uint uLo;
}
//API
/**
* @brief 全局初始化,在所有接口调用之前调用
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_Setup();
/**
* @brief 全局释放
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_Cleanup();
public delegate void VZLPRC_COMMON_NOTIFY_CALLBACK(int handle, IntPtr pUserData,
VZ_LPRC_COMMON_NOTIFY eNotify, string pStrDetail);
/**
* @brief 设置设备连接反馈结果相关的回调函数
* @param [IN] func 设备连接结果和状态,通过该回调函数返回
* @param [IN] pUserData 回调函数中的上下文
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VZLPRClient_SetCommonNotifyCallBack(VZLPRC_COMMON_NOTIFY_CALLBACK func, IntPtr pUserData);
/**
* @brief 打开一个设备
* @param [IN] pStrIP 设备的IP地址
* @param [IN] wPort 设备的端口号
* @param [IN] pStrUserName 访问设备所需用户名
* @param [IN] pStrPassword 访问设备所需密码
* @return 返回设备的操作句柄,当打开失败时,返回-1
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_Open(string pStrIP, ushort wPort, string pStrUserName, string pStrPassword);
/**
* @brief 关闭一个设备
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_Close(int handle);
/**
* @brief 通过IP地址关闭一个设备
* @param [IN] pStrIP 设备的IP地址
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_CloseByIP(string pStrIP);
/**
* @brief 获取连接状态
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @param[IN/OUT] pStatus 输入获取状态的变量地址,输出内容为 1已连上,0未连上
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_IsConnected(int handle, IntPtr pStatus);
/**
* @brief 播放实时视频
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @param [IN] hWnd 窗口的句柄
* @return 播放句柄,小于0表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_StartRealPlay(int handle, IntPtr hWnd);
/**
* @brief 停止正在播放的窗口上的实时视频
* @param [IN] hWnd 窗口的句柄
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_StopRealPlay(int hRealHandle);
public delegate int VZLPRC_PLATE_INFO_CALLBACK(int handle, IntPtr pUserData,
IntPtr pResult, uint uNumPlates,
VZ_LPRC_RESULT_TYPE eResultType,
IntPtr pImgFull,
IntPtr pImgPlateClip);
public delegate int VZLPRC_VIDEO_FRAME_CALLBACK(int handle, IntPtr pUserData,
IntPtr pFrame);
/**
* @brief 设置实时图像数据的回调函数
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @param [IN] func 实时图像数据函数
* @param [IN] pUserData 回调函数中的上下文
* @return 0表示成功,-1表示失败
* @ingroup group_device
*/
[DllImport("iLPRSDK.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int VzLPRClient_SetVideoFrameCallBack(int handle, IntPtr pFunc, IntPtr pUserData);
/**
* @brief 设置识别结果的回调函数
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @param [IN] func 识别结果回调函数
* @param [IN] pUserData 回调函数中的上下文
* @param [IN] bEnableImage 指定识别结果的回调是否需要包含截图信息:1为需要,0为不需要
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int VzLPRClient_SetPlateInfoCallBack(int handle, VZLPRC_PLATE_INFO_CALLBACK func, IntPtr pUserData, int bEnableImage);
/**
* @brief 发送软件触发信号,强制处理当前时刻的数据并输出结果
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_ForceTrigger(int handle);
/**
* @brief 设置虚拟线圈
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @param [IN] pVirtualLoops 虚拟线圈的结构体指针
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_SetVirtualLoop(int handle, ref VZ_LPRC_VIRTUAL_LOOPS pVirtualLoops);
/**
* @brief 获取已设置的虚拟线圈
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @param [IN] pVirtualLoops 虚拟线圈的结构体指针
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_GetVirtualLoop(int handle, ref VZ_LPRC_VIRTUAL_LOOPS pVirtualLoops);
/**
* @brief 获取已设置的预设省份
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @param [IN] pProvInfo 预设省份信息指针
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_GetSupportedProvinces(int handle, ref VZ_LPRC_PROVINCE_INFO pProvInfo);
/**
* @brief 设置预设省份
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @param [IN] nIndex 设置预设省份的序号,序号需要参考VZ_LPRC_PROVINCE_INFO::strProvinces中的顺序,从0开始,如果小于0,则表示不设置预设省份
* @return 0表示成功,-1表示失败
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_PresetProvinceIndex(int handle, int nIndex);
/**
* @brief 将图像保存为JPEG到指定路径
* @param [IN] pImgInfo 图像结构体,目前只支持默认的格式,即ImageFormatRGB
* @param [IN] pFullPathName 设带绝对路径和JPG后缀名的文件名字符串
* @param [IN] nQuality JPEG压缩的质量,取值范围1~100;
* @return 0表示成功,-1表示失败
* @note 给定的文件名中的路径需要存在
* @ingroup group_global
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_ImageSaveToJpeg(IntPtr pImgInfo, string pFullPathName, int nQuality);
/**
* @brief 读出设备序列号,可用于二次加密
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @param [IN/OUT] pSN 用于存放读到的设备序列号,详见定义 VZ_DEV_SERIAL_NUM
* @return 返回值为0表示成功,返回-1表示失败
* @ingroup group_device
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_GetSerialNumber(int handle, IntPtr pSN);
/**
* @brief 保存正在播放的视频的当前帧的截图到指定路径
* @param [IN] nPlayHandle 播放的句柄
* @param [IN] pFullPathName 设带绝对路径和JPG后缀名的文件名字符串
* @param [IN] nQuality JPEG压缩的质量,取值范围1~100;
* @return 0表示成功,-1表示失败
* @note 使用的文件名中的路径需要存在
* @ingroup group_device
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_GetSnapShootToJpeg2(int nPlayHandle, string pFullPathName, int nQuality);
/**
* @brief 通过该回调函数获得透明通道接收的数据
* @param [IN] nSerialHandle VzLPRClient_SerialStart返回的句柄
* @param [IN] pStrIPAddr 设备IP地址
* @param [IN] usPort1 设备端口号
* @param [IN] usPort2 预留
* @param [IN] pUserData 回调函数上下文
* @ingroup group_global
*/
public delegate int VZDEV_SERIAL_RECV_DATA_CALLBACK(int nSerialHandle, IntPtr pRecvData, int uRecvSize, IntPtr pUserData);
/**
* @brief 开启透明通道
* @param [IN] handle 由VzLPRClient_Open函数获得的句柄
* @param [IN] nSerialPort 指定使用设备的串口序号:0表示第一个串口,1表示第二个串口
* @param [IN] func 接收数据的回调函数
* @param [IN] pUserData 接收数据回调函数的上下文
* @return 返回透明通道句柄,0表示失败
* @ingroup group_device
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_SerialStart(int handle, int nSerialPort, VZDEV_SERIAL_RECV_DATA_CALLBACK func, IntPtr pUserData);
/**
* @brief 透明通道发送数据
* @param [IN] nSerialHandle 由VzLPRClient_SerialStart函数获得的句柄
* @param [IN] pData 将要传输的数据块的首地址
* @param [IN] uSizeData 将要传输的数据块的字节数
* @return 0表示成功,其他值表示失败
* @ingroup group_device
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_SerialSend(int nSerialHandle, IntPtr pData, int uSizeData);
/**
* @brief 透明通道停止发送数据
* @param [IN] nSerialHandle 由VzLPRClient_SerialStart函数获得的句柄
* @return 0表示成功,其他值表示失败
* @ingroup group_device
*/
[DllImport("iLPRSDK.dll")]
public static extern int VzLPRClient_SerialStop(int nSerialHandle);
}