/// <summary> /// 实时视频回调 /// </summary> /// <param name="pFirstParameter"></param> /// <param name="wVideoID"></param> /// <param name="wSize"></param> /// <param name="pbImage"></param> /// <returns></returns> private static unsafe long onVideoCallBack(IntPtr pFirstParameter, UInt16 wVideoID, UInt16 wSize, byte *pbImage) { HvResult hvresult = Marshal.GetObjectForIUnknown(pFirstParameter) as HvResult; if (null == hvresult) { return(-1); } int iSize = wSize; if (iSize < 1) { return(-1); } if (iSize > hvresult.VideoImage.Length) { Array.Resize <byte>(ref hvresult.VideoImage, iSize); } //分配图像字节,该句注释再测试节省内存空间 hvresult.VideoImage = new byte[iSize]; Marshal.Copy((IntPtr)pbImage, hvresult.VideoImage, 0, iSize); hvresult.VideoSize = iSize; hvresult.dtVideo = DateTime.Now; return(0); }
/// <summary> /// 大图回传 /// </summary> /// <param name="pFirstParameter">第一个传递参数</param> /// <param name="dwCarID">车号</param> /// <param name="wImageWidth">图像尺寸宽度</param> /// <param name="wImageHigh">图像尺寸高度</param> /// <param name="bType">图像类别</param> /// <param name="wSize">数据大小</param> /// <param name="pbImage">图像数据的指针</param> /// <param name="wImageID">图像的ID号,表示得到的是哪一张图片</param> /// <param name="wHighImgFlag">高清图片标志</param> /// <param name="wPlateWidth">表示该图象中检测到的车牌矩形左上坐标</param> /// <param name="wPlateHigh">表示该图象中检测到的车牌矩形右下坐标</param> /// <param name="dwTimeMs">时间</param> /// <returns></returns> private unsafe long onBigImgCallBack(IntPtr pFirstParameter, uint dwCarID, ushort wImageWidth, ushort wImageHigh, byte bType, ushort wSize, byte *pbImage, ushort wImageID, ushort wHighImgFlag, ushort wPlateWidth, ushort wPlateHigh, ulong dwTimeMs) { HvResult hvresult = Marshal.GetObjectForIUnknown(pFirstParameter) as HvResult; if (null == hvresult) { return(-1); } int iSize = wSize; if (iSize < 1) { return(-1); } //wHighImgFlag的值跟FF00按位与操作,如果高8位是FF,&结果不为0,则应是高清图片 ////取wHighImgFlag低8位,并左移16位 if ((wHighImgFlag & 0xFF00) != 0) { iSize = wSize + (int)((wHighImgFlag & 0x00FF) << 16); } hvresult.CarID = dwCarID; //拷贝图片数据 hvresult.BigImage = new byte[iSize]; Marshal.Copy((IntPtr)pbImage, hvresult.BigImage, 0, iSize); return(0); }
/// <summary> /// 小图回调 /// </summary> /// <param name="pFirstParameter"></param> /// <param name="dwCarID"></param> /// <param name="wImageWidth"></param> /// <param name="wImageHigh"></param> /// <param name="bType"></param> /// <param name="wSize"></param> /// <param name="pbImage"></param> /// <param name="dwTimeMs"></param> /// <returns></returns> private unsafe long onSmallImgCallBack(IntPtr pFirstParameter, uint dwCarID, ushort wImageWidth, ushort wImageHigh, byte bType, ushort wSize, byte *pbImage, ulong dwTimeMs) { HvResult hvresult = Marshal.GetObjectForIUnknown(pFirstParameter) as HvResult; if (null == hvresult) { return(-1); } ////设置缓存长度 int iRealLen = 0; int iBuffLen = (int)wImageWidth * (int)wImageHigh * 3 + 1024; hvresult.SmallImage = new byte[iBuffLen]; ////m_Redult为存储结果流的类 long state = 0; fixed(byte *pDest = hvresult.SmallImage) { state = HVDLLFun.Yuv2BMP(pDest, iBuffLen, ref iRealLen, pbImage, wImageWidth, wImageHigh); Array.Resize <byte>(ref hvresult.SmallImage, iRealLen); } return(0); }
/// <summary> /// 获取视频信息 /// </summary> /// <param name="iVideo">视频通道号</param> /// <returns></returns> public HvVideoInfo getVideoInfo(int iVideo) { HvVideoInfo info = new HvVideoInfo(); if (IntPtr.Zero == this.m_Hv) { return(info); } HvResult hvresult = this.resultFirst; if (0 != iVideo) { hvresult = this.resultSecond; } info.DtVideo = hvresult.dtVideo; info.VideoSize = hvresult.VideoSize; info.VideoImage = hvresult.VideoImage; return(info); }
/// <summary> /// 重置识别器结果信息 /// <param name="iVideo">视频通道号</param> /// </summary> public void ResetInfo(int iVideo) { if (IntPtr.Zero == this.m_Hv) { return; } HvResult hvresult = this.resultFirst; if (0 != iVideo) { hvresult = this.resultSecond; } hvresult.info = ""; hvresult.strcolor = ""; hvresult.strplateno = ""; hvresult.strTime = ""; hvresult.BigImage = new byte[0]; hvresult.SmallImage = new byte[0]; }
/// <summary> /// 获取视频通道当前识别信息 /// </summary> /// <param name="iVideo">视频通道号(0,1)</param> /// <returns></returns> public HvCarPlateInfo getCarPlateInfo(int iVideo) { HvCarPlateInfo info = new HvCarPlateInfo(); if (IntPtr.Zero == this.m_Hv) { return(info); } HvResult hvresult = this.resultFirst; if (0 != iVideo) { hvresult = this.resultSecond; } info.CarNum = hvresult.strplateno; info.BigImage = hvresult.BigImage; info.SmallImage = hvresult.SmallImage; return(info); }
/// <summary> /// 车牌号回调 /// </summary> /// <param name="pFirstParameter">第一个传递参数</param> /// <param name="dwCarID">车号</param> /// <param name="pcPlateNo">车牌号</param> /// <param name="dwTimeMs">时间</param> /// <returns></returns> private long onPlateNoCallBack(IntPtr pFirstParameter, uint dwCarID, string pcPlateNo, ulong dwTimeMs) { HvResult hvresult = Marshal.GetObjectForIUnknown(pFirstParameter) as HvResult; if (null == hvresult) { return(-1); } string strplateno, strcolor; int length = pcPlateNo.Length; strcolor = pcPlateNo.Substring(0, 1); strplateno = pcPlateNo.Substring(1, length - 1); //时间的转化 long time_C_Long = (long)dwTimeMs; //C++长整型日期,毫秒为单位 DateTime dt_1970 = new DateTime(1970, 1, 1, 0, 0, 0, 0); long tricks_1970 = dt_1970.Ticks; //1970年1月1日刻度 long time_tricks = tricks_1970 + time_C_Long * 10000; //日志日期刻度 DateTime dt = new DateTime(time_tricks); //转化为DateTime(世界时间) DateTime dt2 = dt.ToLocalTime(); //将世界时间转化为当前时间(本时区的时间) hvresult.strTime = string.Format("{0:yyyy-MM-dd HH:mm:ss}", dt2); byte[] plateinfo = new byte[256]; unsafe { byte *pszInfo = null; HVDLLFun.HV_GetPlateInfo(hvresult.m_Hv, &pszInfo); //提取附加的信息 Marshal.Copy((IntPtr)pszInfo, plateinfo, 0, 256); } hvresult.CarID = dwCarID; hvresult.info = Encoding.Default.GetString(plateinfo); hvresult.strcolor = strcolor; hvresult.strplateno = strplateno; return(0); }
/// <summary> /// 读取视频图像流 /// </summary> /// <param name="iVideo">视频通道号(0,1)</param> /// <returns></returns> public MemoryStream getStreamVideo(int iVideo) { if (IntPtr.Zero == this.m_Hv) { return(null); } HvResult hvresult = this.resultFirst; if (0 != iVideo) { hvresult = this.resultSecond; } if (hvresult.VideoSize < 1 || hvresult.VideoImage.Length < 1) { return(null); } try { hvresult.streamVideo.SetLength(hvresult.VideoSize); hvresult.streamVideo.Seek(0, SeekOrigin.Begin); hvresult.streamVideo.Write(hvresult.VideoImage, 0, hvresult.VideoSize); }catch { } return(hvresult.streamVideo); }