Exemple #1
0
        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");
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        //识别二维码
        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));
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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;
        }
Exemple #6
0
        /// <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);
        }
Exemple #7
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();//显示鼠标指针
     }
 }
Exemple #8
0
        //进行一对一对比
        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);
        }
Exemple #9
0
        /// <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
        }
Exemple #10
0
        /// <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");
        }
Exemple #11
0
        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;
        }
Exemple #12
0
 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);
 }
Exemple #13
0
        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);
        }
Exemple #14
0
        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;
        }
Exemple #15
0
        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);
        }
Exemple #16
0
        //寻找证/卡
        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);
        }
Exemple #17
0
        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);
                }
            }
        }
Exemple #18
0
        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));
        }
Exemple #19
0
        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);
        }
Exemple #20
0
        //返回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);
        }
Exemple #21
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);
        }
Exemple #22
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);
        }
Exemple #23
0
        // 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);
        }
Exemple #24
0
        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);
        }
Exemple #25
0
        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);
        }
Exemple #26
0
        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);
        }
Exemple #27
0
        /// <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);
        }
Exemple #28
0
        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);
        }
Exemple #29
0
        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);
        }
Exemple #30
0
        /// <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);
        }