private void FuncLiveCamShow() { if (!indusCamOper.Play()) { WinCall.TraceMessage("***indusCamOper.Play() error"); return; } //int nWaitMS = JobManager.IDLE_WAIT_MS; int nWaitMS = 150; while (!stopLiveCamEvent.WaitOne(nWaitMS, true)) { //live photo Bitmap bmCur = indusCamOper.QueryFrame(400); if (bmCur == null) { continue; } //垂直翻转画面 bmCur.RotateFlip(RotateFlipType.Rotate180FlipY); Bitmap bmDetect = DetectFace(bmCur); if (stopLiveCamEvent.WaitOne(nWaitMS / 2, true)) { break; } mainWin.RefreshLiveCam(bmDetect); } indusCamOper.Stop(); WinCall.TraceMessage("***liveCamThread exit"); }
private string GenNextFileName(string strInitDBName) { string strDir = Path.GetDirectoryName(strInitDBName); string strNameOnly = Path.GetFileNameWithoutExtension(strInitDBName); string strExt = Path.GetExtension(strInitDBName); int iEnd = strNameOnly.Length - 1; for (; iEnd >= 0; iEnd--) { if (!Char.IsDigit(strNameOnly[iEnd])) { break; } } string strNewPath = ""; string strPre = strNameOnly.Substring(0, iEnd + 1); int i = 0; while (true) { string strNewName = string.Format("{0}{1:D8}{2}", strPre, i, strExt); i++; strNewPath = Path.Combine(strDir, strNewName); if (CanWriteFile(strNewPath)) { WinCall.TraceMessage("**new db=" + strNewPath); break; //找到了 } } return(strNewPath); }
//识别二维码 public bool DoCheckTicket(ref string strQrCode) { DataTickCam data = new DataTickCam(); if (!mainWin.CapTicket(data)) { return(false); } strQrCode = string.Empty; using (Bitmap bmGray = WinCall.BitmapConvetGray(data.bm)) { //垂直翻转 bmGray.RotateFlip(RotateFlipType.Rotate90FlipX); using (ImageScanner scanner = new ImageScanner()) { scanner.SetConfiguration(SymbolType.None, Config.Enable, 1); List <Symbol> symbols = scanner.Scan(bmGray); WinCall.TraceMessage(string.Format("***Ticket syms={0}", symbols.Count)); //! for test foreach (var sym in symbols) { var symType = sym.GetType(); if (!string.IsNullOrEmpty(sym.Data)) { strQrCode = sym.Data; break; //只取一个结果 } } } } data.bm.Dispose(); return(false == string.IsNullOrEmpty(strQrCode)); }
public bool InitCamera() { const int MAX_CAMS = 2; tSdkCameraDevInfo[] sCameraList = null; int iCameraNums = MAX_CAMS; tSdkCameraCapbility sCameraInfo = new tSdkCameraCapbility(); CameraSdkStatus status = MvApi.CameraEnumerateDevice(out sCameraList); if (status != CameraSdkStatus.CAMERA_STATUS_SUCCESS || iCameraNums == 0) { return(false); } //只假设连接了一个相机。 if ((status = MvApi.CameraInit(ref sCameraList[0], -1, -1, ref m_hCamera)) != CameraSdkStatus.CAMERA_STATUS_SUCCESS) { string msg = string.Format("***Failed to init the camera! Error code is {0}", status); WinCall.TraceMessage(msg); return(false); } //Get properties description for this camera. MvApi.CameraGetCapability(m_hCamera, out sCameraInfo); m_ImageBufferSnapshot = Marshal.AllocHGlobal(sCameraInfo.sResolutionRange.iWidthMax * sCameraInfo.sResolutionRange.iHeightMax * 3 + 1024); return(true); }
private void DoCreateTicketCamOper(object objData) { WinCall.ThreadBoolRet pData = (WinCall.ThreadBoolRet)objData; FaceDetect faceDetect = (FaceDetect)pData.pExtra; const int VIDEOWIDTH = 640; const int VIDEOHEIGHT = 480; const int VIDEOBITSPERPIXEL = 24; // BitsPerPixel values determined by device try { tickCamOper = new Capture(faceDetect.GetCamTicketID(), VIDEOWIDTH, VIDEOHEIGHT, VIDEOBITSPERPIXEL, tickPicCtrl); } catch (Exception ex) { WinCall.TraceException(ex); } bool bInit = (tickCamOper != null); if (!bInit) { PromptError("车票摄像头初始化失败!"); } pData.bResult = bInit; }
/// <summary> /// 尝试打开串口 /// </summary> /// <param name="idReaderCom"></param> /// <returns> /// -1 COM口不存在 /// 0 COM口打开失败 /// 1 COM口打开成功 /// </returns> public int TryOpenCOM(int idReaderCom) { string strPort = string.Format("COM{0}", idReaderCom); comPort.PortName = strPort; try { comPort.Open(); } catch (IOException) { return(-1); } catch (Exception ex) { WinCall.TraceException(ex); return(0); } if (comPort.IsOpen) { if (SAM_GetState()) { return(1); } else { comPort.Close(); } } return(0); }
private void OnMouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { WinCall.ReleaseCapture(); WinCall.SendMessage(Handle, WinCall.WM_NCLBUTTONDOWN, WinCall.HT_CAPTION, 0); Cursor.Show();//显示鼠标指针 } }
//进行一对一对比 internal float CompareAFace(float fInitFaceCmpRate, int iPorttrail) { float fScore = fInitFaceCmpRate; int iFtrSize = 0; HWGetFeatureSize(handleLib, ref iFtrSize); IntPtr pbFtrID = Marshal.AllocHGlobal(iFtrSize); IntPtr pbFtrLiveFace = Marshal.AllocHGlobal(iFtrSize); //如果确定是证件照,可以设Portrait= 1, 否则设Portrait = 0 HWSetPortrait(handleLib, iPorttrail); int iMaxFace = 1; HWFaceInfo[] idFaceInfo = new HWFaceInfo[iMaxFace]; //找身份证上的人脸 HWRESULT iRst = HWDetectFaceKeyPoints(handleLib, idPhotoData.pixel, idPhotoData.width, idPhotoData.height, ref iMaxFace, ref idFaceInfo); if (iRst != S_OK) { WinCall.TraceMessage("***没找身份证上的人脸"); Marshal.FreeHGlobal(pbFtrID); Marshal.FreeHGlobal(pbFtrLiveFace); return(0.0F); } if (S_OK != HWExtractFeature(handleLib, idPhotoData.pixel, idPhotoData.width, idPhotoData.height, ref idFaceInfo[0], pbFtrID)) { Marshal.FreeHGlobal(pbFtrID); Marshal.FreeHGlobal(pbFtrLiveFace); return(0.0F); } //找出现场照片上的人脸 var hr = S_FAIL; lock (lockLivePhoto) { hr = HWExtractFeature(handleLib, livePhotoData.pixel, livePhotoData.width, livePhotoData.height, ref curLiveFaceInfo, pbFtrLiveFace); StoreLivePhoto(); } if (S_OK != hr) { Marshal.FreeHGlobal(pbFtrID); Marshal.FreeHGlobal(pbFtrLiveFace); return(0.0F); } WinCall.TraceMessage("***HWExtractFeature all ok\n"); HWCompareFeature(handleLib, pbFtrID, pbFtrLiveFace, ref fScore); Marshal.FreeHGlobal(pbFtrID); Marshal.FreeHGlobal(pbFtrLiveFace); return(fScore); }
/// <summary> /// 保存身份证照片和现场照片,留底 /// </summary> /// <param name="fScore"></param> public void KeepCompareInfo(float fScore) { #if KEEP_PIC_LOG if (!logdb.TryOpen()) { WinCall.TraceMessage("***KeepCompareInfo创建数据库失败!"); return; } logdb.InsertRec(idTextDecoder.m_strName, idTextDecoder.m_strID, fScore, bmIDPhoto, faceCmpEngine.GetStoreLivePic()); #endif }
/// <summary> /// 主工作线程 /// </summary> private void FuncMainFaceCmp() { JobManager jm = new JobManager(); jm.disPatch(JobManager.sHandlerReadIDCard, this); //init while (!stopMainEvent.WaitOne(JobManager.IDLE_WAIT_MS, true)) { jm.doWork(this); } WinCall.TraceMessage("***FuncMainFaceCmpThread exit"); }
private string strLastIDPhotoFile = string.Empty; //最后一次成功解码的照片位置 public ComIdCardReader() { WinCall.ZeroArr(mRecvData); comPort.BaudRate = 115200; comPort.DataBits = 8; comPort.StopBits = StopBits.One; comPort.Handshake = Handshake.None; //! comPort.Parity = Parity.None; comPort.ReadTimeout = 1000; comPort.WriteTimeout = 1000; }
private bool ComSend(byte[] cSendData, int iStart, int n) { try { comPort.Write(cSendData, iStart, n); } catch (System.Exception ex) { WinCall.TraceException("ComSend", ex); return(false); } return(true); }
int SAM_ReadExtraMsg() { byte sw1, sw2, sw3; int ret = SendCommand(0x30, 0x03, out sw1, out sw2, out sw3, 3000); const int RET_HEAD = 10; if ((ret > 0) && (sw3 == 0x90)) { WinCall.CopyArr(pucExtra, 0, mRecvData, RET_HEAD, 70); return(0); } return(ret); }
void ResetData() { WinCall.ZeroArr(mRecvData); WinCall.ZeroArr(pucIIN); WinCall.ZeroArr(pucSN); WinCall.ZeroArr(pucBaseText); WinCall.ZeroArr(pucPhoto); WinCall.ZeroArr(pucExtra); WinCall.ZeroArr(mRecvData); //m_bLastRead = false; _pucBaseTextLen = 0; _pucPhotoLen = 0; strLastIDPhotoFile = string.Empty; }
int SAM_SelectCard() { byte sw1 = 0; byte sw2 = 0; byte sw3 = 0; int ret = 0; //aa aa aa 96 69 00 03 20 01 22 ed ret = SendCommand(0x20, 0x02, out sw1, out sw2, out sw3, 1000); if ((ret > 0) && (sw3 == 0x90)) { WinCall.CopyArr(pucSN, 0, mRecvData, 10, 8); return(0); } return(ret); }
//寻找证/卡 int SAM_FindCard() { byte sw1 = 0; byte sw2 = 0; byte sw3 = 0; int ret = 0; ret = SendCommand(0x20, 0x01, out sw1, out sw2, out sw3, 1000); if ((ret > 0) && (sw3 == 0x9f)) { WinCall.CopyArr(pucIIN, 0, mRecvData, 10, 4); //memcpy(pucIIN, &mRecvData[10], 4); //printf("FindCard,sw:%d,%d,%d.\n",sw1,sw2,sw3); return(0); } return(ret); }
private void GetGrayPixel(PicPixel pPix, Bitmap bmCur) { int nW = pPix.width; int nH = pPix.height; using (Bitmap bmTemp = WinCall.BitmapScale(bmCur, nW, nH)) { using (Bitmap bmGrapy = WinCall.BitmapConvetGray(bmTemp)) { Rectangle rect = new Rectangle(0, 0, nW, nH); BitmapData dataGray = bmGrapy.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); System.IntPtr ptrGray = dataGray.Scan0; WinCall.CopyMemory(pPix.pixel, ptrGray, nW * nH); bmGrapy.UnlockBits(dataGray); } } }
private static void PrintGetBmpError(int nRet) { string strRet = "ok"; switch (nRet) { case 1: strRet = "相片解码正确"; break; case 0: strRet = "调用sdtapi.dll错误"; break; case -1: strRet = "相片解码错误"; break; case -2: strRet = "wlt文件后缀错误"; break; case -3: strRet = "wlt文件打开错误"; break; case -4: strRet = "wlt文件格式错误"; break; case -5: strRet = "软件未授权"; break; case -6: strRet = "设备连接错误"; break; default: strRet = "unknown"; break; } WinCall.TraceMessage(string.Format("***GetBmp return,{0}", strRet)); }
public bool LoadIDPhoto() { if (bmIDPhoto != null) { bmIDPhoto.Dispose(); bmIDPhoto = null; } string strBmpPath = idCardReader.GetLastIDPhotoFile(); bmIDPhoto = WinCall.LoadBitmap(strBmpPath); bool bOk = (bmIDPhoto != null); if (bOk) { faceCmpEngine.GetIDPhoto(bmIDPhoto); } return(bOk); }
//返回0成功 //-1 失败 //-2 可以重试 private int RecvPackage(ushort Cmd, ushort CmdData) { int len, packlen; byte crc = 0; int repcmd, repdat; if (!ComRead(0, 3, MS_WAIT)) { return(-1); } len = (mRecvbuf[1] << 8) + mRecvbuf[2]; if (len + 4 > MAX_CMDLEN) { return(-2); } int nDat = len + 4 - 2; if (!ComRead(3, nDat, MS_WAIT)) { return(-2); } repcmd = (mRecvbuf[3] << 8) | mRecvbuf[4]; repdat = (mRecvbuf[5] << 8) | mRecvbuf[6]; if (repcmd != Cmd) { return(-2); } packlen = nDat + 3; //整包数据 crc = CalcCrc(mRecvbuf, 3, packlen - 5); if (mRecvbuf[packlen - 2] != crc) { WinCall.TraceMessage("***RecvPack,BAD CRC."); return(-2); } mRecvlen = packlen; return(0); }
/// <summary> buffer callback, COULD BE FROM FOREIGN THREAD. </summary> int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen) { // Note that we depend on only being called once per call to Click. Otherwise // a second call can overwrite the previous image. Debug.Assert(BufferLen == Math.Abs(m_stride) * m_videoHeight, "Incorrect buffer length"); if (m_WantOne) { m_WantOne = false; Debug.Assert(m_ipBuffer != IntPtr.Zero, "Unitialized buffer"); // Save the buffer WinCall.CopyMemory(m_ipBuffer, pBuffer, BufferLen); // Picture is ready. m_PictureReady.Set(); } return(0); }
//读固定信息 int SAM_ReadBaseMsg() { byte sw1, sw2, sw3; int ret = SendCommand(0x30, 0x01, out sw1, out sw2, out sw3, 3000); const int RET_HEAD = 10; if ((ret > 0) && (sw3 == 0x90)) { //所有固定文本信息,其实都是256 _pucBaseTextLen = (mRecvData[RET_HEAD] << 8) | mRecvData[RET_HEAD + 1]; WinCall.CopyArr(pucBaseText, 0, mRecvData, RET_HEAD + 4, _pucBaseTextLen); //读出的照片数据,其实都是1024 _pucPhotoLen = (mRecvData[RET_HEAD + 2] << 8) | mRecvData[RET_HEAD + 3]; WinCall.CopyArr(pucPhoto, 0, mRecvData, RET_HEAD + 4 + _pucBaseTextLen, _pucPhotoLen); //? return(0); } return(-1); }
// iGate=0右闸门 // iGate=1左闸门 internal bool OpenGate(int iGate) { bool bOk = false; int nMax = g_ArrGeteOpen.Length; if (0 > iGate || iGate > nMax) { return(false); } ushort sData = g_ArrGeteOpen[iGate]; bOk = SendCommand(LOCK_CMD_GATE, g_ArrGeteOpen[iGate]) == 0; if (!bOk) { string str = string.Format("***发送闸门命令失败: cmd={0}, data={1}", LOCK_CMD_GATE, sData); WinCall.TraceMessage(str); } return(bOk); }
internal bool SwitchLight(int iLight, bool bOpen) { bool bOk = false; int nMax = g_ArrLightCmdOpen.Length; if (0 > iLight || iLight > nMax) { return(false); } ushort sData = bOpen ? g_ArrLightCmdOpen[iLight] : g_ArrLightCmdClose[iLight]; bOk = SendCommand(LOCK_CMD_LED, sData) == 0; if (!bOk) { string str = string.Format("***获取命令反馈失败: cmd={0}, data={1}", LOCK_CMD_LED, sData); WinCall.TraceMessage(str); } return(bOk); }
private bool ComRead(int iStart, int nRead, int nTimeout) { comPort.ReadTimeout = nTimeout; int nGet = 0; int nToRead = nRead; try { while (nGet < nRead) { nGet += comPort.Read(mRecvData, iStart + nGet, nToRead); nToRead = nRead - nGet; } } catch (System.Exception ex) { WinCall.TraceException("ComRead", ex); } return(nGet == nRead); }
private bool OpenDB(string strCurDbName, string strPass) { if (0 != dbHelper.Open(strCurDbName, out db)) { WinCall.TraceMessage(string.Format("***OpenDB {0} failed!", strCurDbName)); return(false); } string strPSstr = string.Format("PRAGMA key ='{0}'", strPass); if (!dbHelper.Exec(db, strPSstr)) { WinCall.TraceMessage("***OpenDB, 密码不正确\n"); CloseDB(); return(false); } if (!CreateTable()) { CloseDB(); return(false); } return(true); }
/// <summary> /// 进行人脸对比操作 /// </summary> /// <param name="fScore">输出人脸识别分数</param> /// <returns></returns> public bool DoFaceCmp(ref float fScore) { float fScmp = 0.0F; //两个图片的比对。 并且保存特征. fScmp = faceCmpEngine.CompareAFace(configInfo.InitFaceCmpRate / 1000.0F, 0); fScmp = fScmp * 100.0F; #if FACE_ZUOBI //人脸识别分数作弊 if (fScmp > 0.0000) { fScmp += 9.5786; } #endif string strScore = string.Format("人脸识别相似度:{0:F2}%", fScmp); WinCall.TraceMessage(strScore); PromptInfo(strScore); fScore = fScmp; return(fScmp >= configInfo.ReqFaceCmpScore); }
internal bool TryOpenCOM(int gateBoardCom) { comPort.BaudRate = 9600; comPort.DataBits = 8; comPort.StopBits = StopBits.One; comPort.Handshake = Handshake.None; //! comPort.Parity = Parity.None; comPort.ReadTimeout = 800; comPort.WriteTimeout = 800; string strPort = string.Format("com{0}", gateBoardCom); comPort.PortName = strPort; try { comPort.Open(); } catch (Exception ex) { WinCall.TraceException(ex); } return(comPort.IsOpen); }
internal bool InsertRec(string strName, string strID, float fScore, Bitmap bmIDPhoto, Bitmap bmLivePhoto) { byte[] byIDPhoto = GetPhotoBytes(bmIDPhoto); byte[] byLivePhoto = null; //把现场照片缩小一点,减小数据库大小 using (Bitmap bmLiveSmall = WinCall.BitmapScale(bmLivePhoto, 1024, 768)) { byLivePhoto = GetPhotoBytes(bmLiveSmall); } string strIns = string.Format("INSERT INTO {0}(name,IDNo,RecRate,IDPhoto,LivePhoto) VALUES('{1}','{2}',{3},?,?)", DEF_LOG_DB_NAME, strName, strID, fScore); var stmt = dbHelper.Prepare2(db, strIns); if (stmt.StmtPtr == IntPtr.Zero) { return(false); } int iCol = 1; var err = dbHelper.BindBlob(stmt, iCol++, byIDPhoto, byIDPhoto.Length, IntPtr.Zero); if (err != SQLiteErrorCode.Ok) { return(false); } err = dbHelper.BindBlob(stmt, iCol++, byLivePhoto, byLivePhoto.Length, IntPtr.Zero); if (err != SQLiteErrorCode.Ok) { return(false); } dbHelper.Step(stmt); err = dbHelper.Finalize(stmt); return(err == SQLiteErrorCode.Ok); }
/// <summary> /// Get the image from the Still pin. The returned image can turned into a bitmap with /// Bitmap b = new Bitmap(cam.Width, cam.Height, cam.Stride, PixelFormat.Format24bppRgb, m_ip); /// If the image is upside down, you can fix it with /// b.RotateFlip(RotateFlipType.RotateNoneFlipY); /// </summary> /// <returns>Returned pointer to be freed by caller with Marshal.FreeCoTaskMem</returns> public IntPtr Click() { int hr; // get ready to wait for new image m_PictureReady.Reset(); m_ipBuffer = Marshal.AllocCoTaskMem(Math.Abs(m_stride) * m_videoHeight); try { m_WantOne = true; // If we are using a still pin, ask for a picture if (m_VidControl != null) { // Tell the camera to send an image hr = m_VidControl.SetMode(m_pinStill, VideoControlFlags.Trigger); DsError.ThrowExceptionForHR(hr); } // Start waiting if (!m_PictureReady.WaitOne(9000, false)) { throw new Exception("Timeout waiting to get picture"); } } catch (Exception e) { WinCall.TraceException(e); Marshal.FreeCoTaskMem(m_ipBuffer); m_ipBuffer = IntPtr.Zero; throw; } // Got one return(m_ipBuffer); }