예제 #1
0
        private void captureProcess(int captureResult)
        {
            #region captureProcess
            if (captureResult == RS_SDK.RS_SUCCESS)
            {
                MsgPanel.Text = "Captura terminada";
                SaveSeqCheckTargetProcess(capturedImageData, capturedImageWidth, capturedImageHeight);
                TakeAuto.Enabled = true;
            }
            else
            {
                RS_SDK.RS_GetErrString(captureResult, ref m_errorMsg);
                //MsgPanel.Text = m_errorMsg;
                MsgPanel.Text = "Huellas no detectadas";
                MessageBox.Show("Baja calidad o dedo faltante, capture de nuevo.", "Aviso");
                TakeAuto.Enabled = true;
                return;
            }


            int             numOfFingers = 0;
            IntPtr[]        ImageBuffer  = new IntPtr[4];
            int[]           ImageWidth   = new int[4];
            int[]           ImageHeight  = new int[4];
            RSSlapInfoArray slapInfoA    = new RSSlapInfoArray();

            if (SegmentCaptureProcess(capturedImageData, capturedImageWidth, capturedImageHeight, deviceHandle, ref slapInfoA, ref numOfFingers, ref ImageBuffer, ref ImageWidth, ref ImageHeight) == false)
            {
                if (capturedImageData != (IntPtr)0)
                {
                    RS_SDK.RS_FreeImageData(capturedImageData);
                }
                return;
            }

            SegmentSaveImageCaptureProcess(capturedImageData, capturedImageWidth, capturedImageHeight, numOfFingers, slapInfoA, ImageBuffer, ImageWidth, ImageHeight);

            for (int i = 0; i < 4; i++)
            {
                if (ImageBuffer[i] != (IntPtr)0)
                {
                    RS_SDK.RS_FreeImageData(ImageBuffer[i]);
                }
            }

            if (capturedImageData != (IntPtr)0)
            {
                RS_SDK.RS_FreeImageData(capturedImageData);
            }

            Close();
            #endregion
        }
예제 #2
0
        private bool SegmentCaptureProcess(IntPtr imageData, int imageWidth, int imageHeight, int deviceHandle, ref RSSlapInfoArray slapInfo,
                                           ref int numOfFingers, ref IntPtr[] ImageBuffer, ref int[] ImageWidth, ref int[] ImageHeight)
        {
            #region SegmentCaptureProcess
            RSSlapInfoArray slapInfoA = new RSSlapInfoArray();
            IntPtr          slapInfoArray;

            int captureMode   = 0;
            int captureOption = 0;
            int slapType      = 1;

            for (int i = 0; i < 4; i++)
            {
                ImageBuffer[i] = (IntPtr)0;
                ImageWidth[i]  = 0;
                ImageHeight[i] = 0;
            }

            int _size = Marshal.SizeOf(typeof(RSSlapInfoArray));
            slapInfoArray = Marshal.AllocHGlobal(_size);
            Marshal.StructureToPtr(slapInfoA, slapInfoArray, true);

            int   fingerType         = 0;
            int[] missingFingerArray = new int[] { 0, 0, 0, 0 };

            int n = 0;
            //if (m_captureDir != RS_SDK.RS_CAPTURE_DIRECTION_DEFAULT)
            //{
            //    int captureDir = RS_SDK.RS_CAPTURE_DIRECTION_DEFAULT;
            //    m_result = RS_SDK.RS_GetCaptureModeWithDir(deviceHandle, ref captureMode, ref captureDir, ref captureOption);
            //}
            //else
            m_result = RS_SDK.RS_GetCaptureMode(deviceHandle, ref captureMode, ref captureOption);

            if (m_result != RS_SDK.RS_SUCCESS)
            {
                RS_SDK.RS_GetErrString(m_result, ref m_errorMsg);
                MsgPanel.Text = m_errorMsg;
            }

            switch (captureMode)
            {
            case RS_SDK.RS_CAPTURE_FLAT_TWO_FINGERS:
            case RS_SDK.RS_CAPTURE_FLAT_TWO_FINGERS_EX:
                slapType = RS_SDK.RS_SLAP_TWO_FINGER;
                break;

            case RS_SDK.RS_CAPTURE_FLAT_SINGLE_FINGER:
            case RS_SDK.RS_CAPTURE_FLAT_SINGLE_FINGER_EX:
                slapType = RS_SDK.RS_SLAP_ONE_FINGER;
                break;

            case RS_SDK.RS_CAPTURE_FLAT_LEFT_FOUR_FINGERS:
                slapType = RS_SDK.RS_SLAP_LEFT_FOUR;
                for (int i = 0; i < 4; i++)
                {
                    if (clbDedo.GetItemChecked(i))
                    {
                        missingFingerArray[n++] = RS_SDK.RS_FGP_LEFT_LITTLE - i;
                    }
                }
                fingerType = RS_SDK.RS_FGP_LEFT_LITTLE;
                break;

            case RS_SDK.RS_CAPTURE_FLAT_RIGHT_FOUR_FINGERS:
                slapType = RS_SDK.RS_SLAP_RIGHT_FOUR;
                for (int i = 0; i < 4; i++)
                {
                    if (clbDedo.GetItemChecked(i))
                    {
                        missingFingerArray[n++] = i + RS_SDK.RS_FGP_RIGHT_INDEX;
                    }
                }
                fingerType = RS_SDK.RS_FGP_RIGHT_INDEX;
                break;

            default:
                MsgPanel.Text = "Cannot segment in this mode";
                return(false);
            }

            m_result = RS_SDK.RS_Segment4(imageData, imageWidth, imageHeight, slapType, ref numOfFingers, ref slapInfoArray, ref ImageBuffer[0], ref ImageWidth[0],
                                          ref ImageHeight[0], ref ImageBuffer[1], ref ImageWidth[1], ref ImageHeight[1], ref ImageBuffer[2], ref ImageWidth[2],
                                          ref ImageHeight[2], ref ImageBuffer[3], ref ImageWidth[3], ref ImageHeight[3]);

            if (m_result != RS_SDK.RS_SUCCESS)
            {
                if (m_result == RS_SDK.RS_ERR_SEGMENT_FEWER_FINGER)
                {
                    if (m_minCount != numOfFingers)
                    {
                        RS_SDK.RS_GetErrString(m_result, ref m_errorMsg);
                        MsgPanel.Text = m_errorMsg;
                        return(false);
                    }
                }
                else
                {
                    RS_SDK.RS_GetErrString(m_result, ref m_errorMsg);
                    MsgPanel.Text = m_errorMsg;
                    return(false);
                }
            }

            MsgPanel.Text = "Calidad:";

            slapInfoA = (RSSlapInfoArray)Marshal.PtrToStructure(slapInfoArray, typeof(RSSlapInfoArray));
            if (slapInfoArray != (IntPtr)0)
            {
                RS_SDK.RS_FreeImageData(slapInfoArray);
            }

            int overlayHandle = -1;
            int j             = 0;
            for (int i = 0; i < numOfFingers; i++)
            {
                if (slapInfoA.RSSlapInfoA[i].fingerType == RS_SDK.RS_FGP_UNKNOWN)
                {
                    if (slapType == RS_SDK.RS_SLAP_LEFT_FOUR)
                    {
                        while (fingerType == missingFingerArray[j])
                        {
                            fingerType--;
                            j++;
                        }

                        slapInfoA.RSSlapInfoA[i].fingerType = fingerType--;
                    }
                    else if (slapType == RS_SDK.RS_SLAP_RIGHT_FOUR)
                    {
                        while (fingerType == missingFingerArray[j])
                        {
                            fingerType++;
                            j++;
                        }

                        slapInfoA.RSSlapInfoA[i].fingerType = fingerType++;
                    }
                }

                slapInfo = slapInfoA;
                Enrolar.
                RSOverlayQuadrangle quad = new RSOverlayQuadrangle();
                quad.pos   = new RSPoint[4];
                quad.color = 0x00ff0000;

                RSRect rect = new RSRect();
                RS_SDK.GetClientRect(PreviewWindow.Handle, ref rect);

                quad.pos[0].x = slapInfoA.RSSlapInfoA[i].fingerPosition[0].x * rect.right / imageWidth;
                quad.pos[0].y = slapInfoA.RSSlapInfoA[i].fingerPosition[0].y * rect.bottom / imageHeight;
                quad.pos[1].x = slapInfoA.RSSlapInfoA[i].fingerPosition[1].x * rect.right / imageWidth;
                quad.pos[1].y = slapInfoA.RSSlapInfoA[i].fingerPosition[1].y * rect.bottom / imageHeight;
                quad.pos[2].x = slapInfoA.RSSlapInfoA[i].fingerPosition[3].x * rect.right / imageWidth;
                quad.pos[2].y = slapInfoA.RSSlapInfoA[i].fingerPosition[3].y * rect.bottom / imageHeight;
                quad.pos[3].x = slapInfoA.RSSlapInfoA[i].fingerPosition[2].x * rect.right / imageWidth;
                quad.pos[3].y = slapInfoA.RSSlapInfoA[i].fingerPosition[2].y * rect.bottom / imageHeight;

                m_result = RS_SDK.RS_AddOverlayQuadrangle(deviceHandle, ref quad, ref overlayHandle);
                m_result = RS_SDK.RS_ShowOverlay(overlayHandle, true);
                if (m_result != RS_SDK.RS_SUCCESS)
                {
                    MsgPanel.Text = "Cannot overlay for quadrangle" + m_result;
                    return(false);
                }
            }

            for (int i = 0; i < numOfFingers; i++)
            {
                MsgPanel.Text += "[" + slapInfoA.RSSlapInfoA[i].fingerType + ":" + slapInfoA.RSSlapInfoA[i].imageQuality + "] ";
            }
            return(true);

            #endregion
        }
예제 #3
0
        private void DoautoCapture()
        {
            #region DoautoCapture
            int n;
            try
            {
                m_result = RS_SDK.RS_RemoveAllOverlay(deviceHandle);
                if (m_result != RS_SDK.RS_SUCCESS)
                {
                    if (MsgPanel.InvokeRequired)
                    {
                        afterAutoCaptureCallback callback = new afterAutoCaptureCallback(captureProcess);
                        try
                        {
                            this.Invoke(callback, m_result);
                        }
                        catch
                        {
                        }
                    }
                    else
                    {
                        RS_SDK.RS_GetErrString(m_result, ref m_errorMsg);
                        MsgPanel.Text = m_errorMsg;
                    }
                    return;
                }

                if (clbDedo.Visible)
                {
                    n = 0;

                    for (int i = 0; i < 4; i++)
                    {
                        if (clbDedo.GetItemChecked(i))
                        {
                            n++;
                        }
                    }

                    m_minCount = m_minCount - n;

                    m_result = RS_SDK.RS_SetMinimumFinger(deviceHandle, m_minCount);
                    if (m_result != RS_SDK.RS_SUCCESS)
                    {
                        RS_SDK.RS_GetErrString(m_result, ref m_errorMsg);
                        MsgPanel.Text = m_errorMsg;
                    }
                }
                else
                {
                    n = 0;

                    for (int i = 0; i < 2; i++)
                    {
                        if (clbPulgar.GetItemChecked(i))
                        {
                            n++;
                        }
                    }

                    m_minCount = m_minCount - n;

                    m_result = RS_SDK.RS_SetMinimumFinger(deviceHandle, m_minCount);
                    if (m_result != RS_SDK.RS_SUCCESS)
                    {
                        RS_SDK.RS_GetErrString(m_result, ref m_errorMsg);
                        MsgPanel.Text = m_errorMsg;
                    }
                }

                m_result = RS_SDK.RS_TakeImageData(deviceHandle, 10000, ref capturedImageData, ref capturedImageWidth, ref capturedImageHeight);

                if (m_result != RS_SDK.RS_SUCCESS)
                {
                    if (capturedImageData != (IntPtr)0)
                    {
                        RS_SDK.RS_FreeImageData(capturedImageData);
                    }
                }

                if (MsgPanel.InvokeRequired)
                {
                    afterAutoCaptureCallback callback = new afterAutoCaptureCallback(captureProcess);
                    try
                    {
                        this.Invoke(callback, m_result);
                    }
                    catch
                    {
                    }
                }
                else
                {
                    RS_SDK.RS_GetErrString(m_result, ref m_errorMsg);
                    MsgPanel.Text = m_errorMsg;
                }
            }
            catch (Exception ex)
            {
                return;
            }
            #endregion
        }