Exemplo n.º 1
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="iCamNo"></param>
        /// <param name="iModelNo"></param>
        /// <param name="dValue"></param>
        /// <returns></returns>
        public int SetSearchAcceptanceThreshold(int iCamNo, int iModelNo, double dValue)
        {
#if SIMULATION_VISION
            return SUCCESS;
#endif
            // Vision System이 초기화 된지를 확인함
            if (m_bSystemInit == false) return GenerateErrorCode(ERR_VISION_SYSTEM_FAIL);

            if (!isValidPatternMarkNo(iModelNo))
                return GenerateErrorCode(ERR_VISION_PATTERN_NONE);

            if (dValue < 0.0 || dValue > 100.0)
                return GenerateErrorCode(ERR_VISION_PARAMETER_UNFIT); 

            CVisionPatternData pSData = m_RefComp.Camera[iCamNo].GetSearchData(iModelNo);
            if (pSData.m_milModel == MIL.M_NULL)
                return GenerateErrorCode(ERR_VISION_PATTERN_NONE); 

            pSData.m_dAcceptanceThreshold = dValue;
            MIL.MpatSetAcceptance(pSData.m_milModel, dValue);

            MIL_ID SourceImage = m_RefComp.View[iCamNo].GetImage();

            MIL.MpatPreprocModel(SourceImage, pSData.m_milModel, MIL.M_DEFAULT);

            return SUCCESS;
        }
Exemplo n.º 2
0
        /// <summary>
        /// 등록된 Mark Search.. GMF는 적용안됨.
        /// </summary>
        /// <param name="iCamNo": Camera Number></param>
        /// <param name="iModelNo": Model Mark Number></param>
        /// <param name="pPatResult" : Result value Check></param>
        /// <param name="bUseGMF" : Not Use></param>
        /// <returns></returns>
        public int RecognitionPatternMark(int iCamNo, int iModelNo, out CResultData pPatResult, bool bUseGMF = false)
        {
            // Vision System이 초기화 된지를 확인함
            if (m_bSystemInit == false) goto VISION_ERROR_GO;
            
            int iResult = 0;
            CVisionPatternData pSData = m_RefComp.Camera[iCamNo].GetSearchData(iModelNo);
            CResultData pSResult; 

            // 모델 생성 여부 확인
            if (pSData.m_bIsModel == false) goto VISION_ERROR_GO;

            // Mark Search 실행
            iResult = m_RefComp.System.SearchByNGC(iCamNo, pSData, out pSResult);

            if(iResult == SUCCESS)
            {
                pSResult.m_strResult = string.Format("-MK:{0} P_X:{1:0.00}  P_Y:{2:0.00}  \n        Sc:{3:0.00}%% Tm:{4:0.0}ms",
                                                    iModelNo,
                                                    pSResult.m_dPixelX,
                                                    pSResult.m_dPixelY,
                                                    pSResult.m_dScore,
                                                    pSResult.m_dTime  *1000);
                if (pSResult.m_bSearchSuccess)
                    pSResult.m_strResult = "OK" + pSResult.m_strResult;
                else
                    pSResult.m_strResult = "NG" + pSResult.m_strResult;

            }
            else
            {
                pSResult.m_strResult = string.Format("Camera{0} : Model : {1} is Not Found! \n [sc:{2:0.00}%% Tm:{3:0.0}ms",
                                                    iCamNo,
                                                    iModelNo,
                                                    pSResult.m_dScore,
                                                    pSResult.m_dTime  *1000);
            }
            // Search 결과 대입
            pPatResult = pSResult;

            // Pattern Search Fail시 Image 저장
            if (pSResult.m_bSearchSuccess==false)
            {
                if(m_bSaveErrorImage)
                {
                    iResult = SaveImage(iCamNo,1,90);
                    if(iResult != SUCCESS)
                    {
                        return GenerateErrorCode(ERR_VISION_PATTERN_SEARCH_FAIL);
                    }
                }
            }
           
            return SUCCESS;
        // Vision Error 처리
        VISION_ERROR_GO:

            pPatResult = new CResultData();
            return GenerateErrorCode(ERR_VISION_PATTERN_SEARCH_FAIL);
        }
Exemplo n.º 3
0
        public MVisionCamera(CObjectInfo objInfo) : base(objInfo)
        {
            int iMarkNum = (int)EPatternMarkType.ALIGN_MARK_COUNT;

            m_iCamID         = 0;
            m_iResult        = 0;
            m_bLive          = false;
            m_cCameraData    = new CCameraData();
            m_rgsCSearchData = new CVisionPatternData[iMarkNum];
            m_rgsCResultData = new CResultData[iMarkNum];

            for (int i = 0; i < iMarkNum; i++)
            {
                // Search Data Init
                m_rgsCSearchData[i]                        = new CVisionPatternData();
                m_rgsCSearchData[i].m_bIsModel             = false;
                m_rgsCSearchData[i].m_dAcceptanceThreshold = DEF_DEFAULT_ACCEP_THRESHOLD;
                m_rgsCSearchData[i].m_dCertaintyThreshold  = DEF_DEFAULT_CERTAIN_THRESHOLD;

                // Result Data Init
                m_rgsCResultData[i] = new CResultData();
                m_rgsCResultData[i].m_bSearchSuccess = false;
                m_rgsCResultData[i].m_milResult      = MIL.M_NULL;
                m_rgsCResultData[i].m_milGMFResult   = MIL.M_NULL;
            }

            m_cCameraData.m_iGrabSettlingTime = 0;
            m_cCameraData.m_iCameraChangeTime = 0;
        }
Exemplo n.º 4
0
        /// <summary>
        /// Search Area 설정
        /// </summary>
        /// <param name="iCamNo": Camera Number></param>
        /// <param name="iModelNo": Model Mark Number></param>
        /// <param name="SArea": Search Area Rectangle></param>
        /// <returns></returns>
        public int SetSearchArea(int iCamNo, int iModelNo, ref Rectangle SArea)
        {
#if SIMULATION_VISION
                return SUCCESS;
#endif
            // Vision System이 초기화 된지를 확인함
            if (m_bSystemInit == false) return GenerateErrorCode(ERR_VISION_SYSTEM_FAIL);

            if (SArea.Width <= DEF_SEARCH_MIN_WIDTH || SArea.Height <= DEF_SEARCH_MIN_HEIGHT ||
                SArea.Width > m_RefComp.Camera[iCamNo].m_CamPixelSize.Width || SArea.Height > m_RefComp.Camera[iCamNo].m_CamPixelSize.Height)
            {
                GenerateErrorCode(ERR_VISION_SEARCH_SIZE_OVER);
            }

            CVisionPatternData pSData = m_RefComp.Camera[iCamNo].GetSearchData(iModelNo);
            pSData.m_rectSearch = SArea;

            MIL.MpatSetPosition(pSData.m_milModel,
                            pSData.m_rectSearch.Left,
                            pSData.m_rectSearch.Top,
                            pSData.m_rectSearch.Width,
                            pSData.m_rectSearch.Height);

            MIL.MpatPreprocModel(MIL.M_NULL, pSData.m_milModel, MIL.M_DEFAULT);

            return SUCCESS;
        }
Exemplo n.º 5
0
 public MIL_ID GetPatternImage(int iCamNo, int iModelNo)
 {
     // Vision System이 초기화 된지를 확인함
     if (m_bSystemInit == false) return GenerateErrorCode(ERR_VISION_SYSTEM_FAIL);
     CVisionPatternData pSData = m_RefComp.Camera[iCamNo].GetSearchData(iModelNo);
     
     return pSData.m_milModel;
 }
Exemplo n.º 6
0
        /// <summary>
        /// Pattern Maching으로 Mark의 위치를 검색함
        /// </summary>
        /// <param name="iCam"></param>
        /// <param name="pSdata"></param>
        /// <param name="pRData"></param>
        /// <returns></returns>
        public int SearchByNGC(int iCamNo, CVisionPatternData pSdata, out CResultData pRData)
        {
            MIL_ID m_MilImage     = m_pDisplay[iCamNo].GetImage();
            MIL_ID m_DisplayGraph = m_pDisplay[iCamNo].GetViewGraph();

            CResultData pResult    = new CResultData();
            Point       RectOffset = new Point();

            // Mark Search Timer Reset
            MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_RESET + MIL.M_SYNCHRONOUS, MIL.M_NULL);
            // Mark Search Command
            MIL.MpatFindModel(m_MilImage, pSdata.m_milModel, m_SearchResult);
            // Mark Search Timer Check
            MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, ref pResult.m_dTime);

            if (MIL.MpatGetNumber(m_SearchResult) == 1L)
            {
                // Display Mark Area
                //MIL.MgraClear(MIL.M_DEFAULT, m_DisplayGraph);
                m_pDisplay[iCamNo].ClearOverlay();
                MIL.MgraColor(MIL.M_DEFAULT, MIL.M_COLOR_GREEN);
                MIL.MpatDraw(MIL.M_DEFAULT, m_SearchResult, m_DisplayGraph, MIL.M_DRAW_BOX, MIL.M_DEFAULT, MIL.M_DEFAULT);
                //DisplaySearchResult();

                MIL.MpatGetResult(m_SearchResult, MIL.M_POSITION_X, ref pResult.m_dPixelX);
                MIL.MpatGetResult(m_SearchResult, MIL.M_POSITION_Y, ref pResult.m_dPixelY);
                MIL.MpatGetResult(m_SearchResult, MIL.M_SCORE, ref pResult.m_dScore);

                RectOffset.X = (int)pResult.m_dPixelX - pSdata.m_pointReference.X - pSdata.m_rectSearch.X;
                RectOffset.Y = (int)pResult.m_dPixelY - pSdata.m_pointReference.Y - pSdata.m_rectSearch.Y;

                pResult.m_rectFindedModel = pSdata.m_rectModel;
                pResult.m_rectFindedModel.Offset(RectOffset);
                pResult.m_rectSearch = pSdata.m_rectSearch;

                if (pResult.m_dScore > pSdata.m_dAcceptanceThreshold)
                {
                    pResult.m_bSearchSuccess = true;

                    // Result Data 전달
                    pRData = pResult;
                    return(SUCCESS);
                }
            }

            // Search Data를 초기화 한다.
            pResult.m_bSearchSuccess  = false;
            pResult.m_dPixelX         = 0.0;
            pResult.m_dPixelY         = 0.0;
            pResult.m_rectSearch      = new Rectangle(0, 0, 0, 0);
            pResult.m_rectFindedModel = new Rectangle(0, 0, 0, 0);

            // Result Data 전달
            pRData = pResult;

            return(GenerateErrorCode(ERR_VISION_PATTERN_SEARCH_FAIL));
        }
Exemplo n.º 7
0
        /// <summary>
        /// SaveModelImage: Model Image를 저장함.
        /// </summary>
        /// <param name="strPath"></param>
        /// <param name="iModelNo"></param>
        /// <returns></returns>
        public bool SaveModelImage(string strPath, int iModelNo)
        {
            CVisionPatternData pSData = m_pCamera.GetSearchData(iModelNo);

            if (pSData.m_ModelImage == MIL.M_NULL)
            {
                return(false);
            }
            MIL.MbufExport(strPath, MIL.M_BMP, pSData.m_ModelImage);

            return(true);
        }
Exemplo n.º 8
0
        public int ReloadModel(int iCamNo, ref CVisionPatternData pSData)
        {
            if (pSData.m_bIsModel == false)
            {
                return(GenerateErrorCode(ERR_VISION_PATTERN_NONE));
            }

            MIL_ID m_MilImage = MIL.M_NULL;
            // Image Load...
            string strLoadFileName = pSData.m_strFilePath + pSData.m_strFileName;

            MIL.MbufRestore(strLoadFileName, m_MilSystem, ref m_MilImage);

            //Draw할 Rec을 생성한다.
            Rectangle pRec = new Rectangle(pSData.m_rectModel.X - pSData.m_rectModel.Width / 2,
                                           pSData.m_rectModel.Y - pSData.m_rectModel.Height / 2,
                                           pSData.m_rectModel.Width, pSData.m_rectModel.Height);

            // Allocate a normalized grayscale model.
            MIL.MpatAllocModel(m_MilSystem, m_MilImage, pRec.X, pRec.Y,
                               pRec.Width, pRec.Height, MIL.M_NORMALIZED, ref pSData.m_milModel);

            // Model Image Save (Image View Save용)
            MIL.MbufAlloc2d(m_MilSystem, pRec.Width, pRec.Height, MIL.M_UNSIGNED + 8, MIL.M_IMAGE + MIL.M_PROC + MIL.M_DISP,
                            ref pSData.m_ModelImage);
            MIL.MbufCopyColor2d(m_MilImage, pSData.m_ModelImage, MIL.M_ALL_BANDS, pRec.X, pRec.Y,
                                MIL.M_ALL_BANDS, 0, 0, pRec.Width, pRec.Height);

            if (pSData.m_milModel == MIL.M_NULL)
            {
                return(GenerateErrorCode(ERR_VISION_PATTERN_NONE));
            }

            MIL.MpatAllocResult(m_MilSystem, MIL.M_DEFAULT, ref m_SearchResult);

            // Set the search accuracy to high.
            MIL.MpatSetAccuracy(pSData.m_milModel, MIL.M_HIGH);

            MIL.MpatSetAcceptance(pSData.m_milModel, pSData.m_dAcceptanceThreshold);  // Acceptance Threshold Setting
            MIL.MpatSetCertainty(pSData.m_milModel, pSData.m_dAcceptanceThreshold);   // Set Certainty Threshold
            MIL.MpatSetCenter(pSData.m_milModel,                                      // Pattern Mark에서 Offset 설정함.
                              (double)pSData.m_pointReference.X,
                              (double)pSData.m_pointReference.Y);

            // Set the search model speed to high.
            MIL.MpatSetSpeed(pSData.m_milModel, MIL.M_HIGH);

            // Preprocess the model.
            MIL.MpatPreprocModel(m_MilImage, pSData.m_milModel, MIL.M_DEFAULT);

            return(SUCCESS);
        }
Exemplo n.º 9
0
        public void DeleteSearchModel(int iModelNo)
        {
            CVisionPatternData pSData = m_rgsCSearchData[iModelNo];

            if (pSData.m_milModel != MIL.M_NULL && pSData.m_bIsModel)
            {
                MIL.MpatFree(pSData.m_milModel);
                pSData.m_milModel = MIL.M_NULL;
                pSData.m_bIsModel = false;
            }

            pSData.m_pointReference       = new Point(0, 0);
            pSData.m_rectSearch           = new Rectangle(3, 3, DEF_IMAGE_SIZE_X - 3, DEF_IMAGE_SIZE_Y - 3);
            pSData.m_dAcceptanceThreshold = 70.0;
            pSData.m_dCertaintyThreshold  = 90.0;
        }
Exemplo n.º 10
0
        /// <summary>
        /// ReLoadPatternMark : Pattern을 SearchData로 부터 재 등록한다.
        /// </summary>
        /// <param name="iCamNo"></param>
        /// <param name="iTypeNo"></param>
        /// <param name="pSData"></param>
        /// <returns></returns>
        public int ReLoadPatternMark(int iCamNo,
                                     int iTypeNo,
                                     CSearchData pSData)
        {
#if SIMULATION_VISION
                return SUCCESS;
#endif
            if (m_RefComp.Camera == null) return GenerateErrorCode(ERR_VISION_CAMERA_FAIL);
            // Vision System이 초기화 된지를 확인함
            if (m_bSystemInit == false) return GenerateErrorCode(ERR_VISION_SYSTEM_FAIL);
            // Pattern Data Load
            m_RefComp.Camera[iCamNo].SetSearchData(iTypeNo, pSData);
            // Mark Register
            CVisionPatternData CurData = m_RefComp.Camera[iCamNo].GetSearchData(iTypeNo);
            m_RefComp.System.ReloadModel(iCamNo, ref CurData);

            return SUCCESS;
        }
Exemplo n.º 11
0
        /// <summary>
        /// Dispaly the registered Model Image or Model Area like below ;
        /// </summary>
        /// <param name="iCamNo" : Camera Number></param>
        /// <param name="iModelNo": Model Number></param>
        /// <param name="pHandle": Display 객체 Handle></param>
        /// <returns></returns>
        public int DisplayPatternImage(int iCamNo, int iModelNo, IntPtr pHandle)
        {
#if SIMULATION_VISION
            return SUCCESS;
#endif
            // Vision System이 초기화 된지를 확인함
            if (m_bSystemInit == false) return GenerateErrorCode(ERR_VISION_SYSTEM_FAIL);
            // Model No 확인
            if (isValidPatternMarkNo(iModelNo) == false) return GenerateErrorCode(ERR_VISION_PATTERN_NONE);
            
            // 저장된 Pattern 정보를 읽어옴
            CVisionPatternData pSData = m_RefComp.Camera[iCamNo].GetSearchData(iModelNo);

            // Data에 MIL 정보를 확인함.
            if (pSData.m_milModel ==MIL.M_NULL) return GenerateErrorCode(ERR_VISION_PATTERN_NONE);

            // Image Display 호출
            m_RefComp.View[iCamNo].DisplayImage(pSData.m_ModelImage, pHandle);
            
            return SUCCESS;
        }
Exemplo n.º 12
0
        /// <summary>
        /// Pattern Maching으로 Mark의 위치 확인
        /// </summary>
        /// <param name="iCamNo": Camera Number></param>
        /// <param name="iModelNo": Model Mark Number></param>
        /// <param name="SearchArea": Search Area Rectangle></param>
        /// <param name="ModelArea": Model Area Rectangle></param>
        /// <param name="ReferencePoint": Reference Point></param>
        /// <returns></returns>
        public int RegisterPatternMark(int iCamNo,
                                       string strModel,
                                       int iTypeNo,
                                       ref Rectangle SearchArea,
                                       ref Rectangle ModelArea,
                                       ref Point ReferencePoint)
        {
#if SIMULATION_VISION
                return SUCCESS;
#endif
            // Vision System이 초기화 된지를 확인함
            if (m_bSystemInit == false) return GenerateErrorCode(ERR_VISION_SYSTEM_FAIL);

            // 모델 갯수 보다 큰 경우 Err
            if (iTypeNo > DEF_USE_SEARCH_MARK_NO) return GenerateErrorCode(ERR_VISION_PATTERN_NUM_OVER);
            // Search Size 확인 
            if (SearchArea.Width <= DEF_SEARCH_MIN_WIDTH ||
               SearchArea.Height <= DEF_SEARCH_MIN_HEIGHT ||
               SearchArea.Width > m_RefComp.Camera[iCamNo].m_CamPixelSize.Width ||
               SearchArea.Height > m_RefComp.Camera[iCamNo].m_CamPixelSize.Height)
            {
                GenerateErrorCode(ERR_VISION_SEARCH_SIZE_OVER);
            }

            // 기존의 Mark 모델 Data를 연결함 (주소값으로 연결됨).
            CVisionPatternData pSData = m_RefComp.Camera[iCamNo].GetSearchData(iTypeNo);

            // 등록할 Mark의 Size 및 위치를 설정함.
            pSData.m_rectModel = ModelArea;
            pSData.m_rectSearch = SearchArea;
            pSData.m_pointReference = ReferencePoint;            

            // 기존에 등록된 모델이 있을 경우 삭제한다.
            if(pSData.m_milModel != MIL.M_NULL)
            {
                MIL.MpatFree(pSData.m_milModel);
                pSData.m_milModel = MIL.M_NULL;
                pSData.m_bIsModel = false;
            }

            // 설정한 Data로 Mark 모델을 등록한다.
            if(m_RefComp.System.RegisterMarkModel(iCamNo, ref pSData)==true)
            {
                pSData.m_bIsModel = true;
                // Model Register Grab Image Save
                string strPath = DEF_PATTERN_FILE;
                string strName = strModel + $"_Cam_{iCamNo}_Type_{iTypeNo}.bmp";
                // Image Save
                SaveModelImage(iCamNo, strPath, strName);

                // Image Path & Name apply
                pSData.m_strFilePath = strPath;
                pSData.m_strFileName = strName;
                
                return SUCCESS;
            }
            else
            {
                pSData.m_bIsModel = false;
                return GenerateErrorCode(ERR_VISION_PATTERN_REG_FAIL);
            }                 
        }
Exemplo n.º 13
0
        public bool RegisterMarkModel(int iCamNo, ref CVisionPatternData pSData)
        {
            // 0 위치를 화면의 중앙으로 설정함.
            pSData.m_rectModel.X = m_pDisplay[iCamNo].GetImageWidth() / 2;
            pSData.m_rectModel.Y = m_pDisplay[iCamNo].GetImageHeight() / 2;

            MIL_ID m_MilImage     = m_pDisplay[iCamNo].GetImage();
            MIL_ID m_DisplayGraph = m_pDisplay[iCamNo].GetViewGraph();

            //Draw할 Rec을 생성한다.
            Rectangle pRec = new Rectangle(pSData.m_rectModel.X - pSData.m_rectModel.Width / 2,
                                           pSData.m_rectModel.Y - pSData.m_rectModel.Height / 2,
                                           pSData.m_rectModel.Width, pSData.m_rectModel.Height);

            // Allocate a normalized grayscale model.
            MIL.MpatAllocModel(m_MilSystem, m_MilImage, pRec.X, pRec.Y,
                               pRec.Width, pRec.Height, MIL.M_NORMALIZED, ref pSData.m_milModel);

            // Model Image Save (Image View Save용)
            MIL.MbufAlloc2d(m_MilSystem, pRec.Width, pRec.Height, MIL.M_UNSIGNED + 8, MIL.M_IMAGE + MIL.M_PROC + MIL.M_DISP,
                            ref pSData.m_ModelImage);
            MIL.MbufCopyColor2d(m_MilImage, pSData.m_ModelImage, MIL.M_ALL_BANDS, pRec.X, pRec.Y,
                                MIL.M_ALL_BANDS, 0, 0, pRec.Width, pRec.Height);

            if (pSData.m_milModel == MIL.M_NULL)
            {
                return(false);
            }

            MIL.MpatAllocResult(m_MilSystem, MIL.M_DEFAULT, ref m_SearchResult);

            // Set the search accuracy to high.
            MIL.MpatSetAccuracy(pSData.m_milModel, MIL.M_HIGH);

            MIL.MpatSetAcceptance(pSData.m_milModel, pSData.m_dAcceptanceThreshold);  // Acceptance Threshold Setting
            MIL.MpatSetCertainty(pSData.m_milModel, pSData.m_dAcceptanceThreshold);   // Set Certainty Threshold
            MIL.MpatSetCenter(pSData.m_milModel,                                      // Pattern Mark에서 Offset 설정함.
                              (double)pSData.m_pointReference.X,
                              (double)pSData.m_pointReference.Y);

            // Set the search model speed to high.
            MIL.MpatSetSpeed(pSData.m_milModel, MIL.M_HIGH);

            //================================================================================================
            //// Angle 설정
            //MIL.MpatSetAngle(pSData.m_milModel, MIL.M_SEARCH_ANGLE_MODE, MIL.M_ENABLE);
            //MIL.MpatSetAngle(pSData.m_milModel, MIL.M_SEARCH_ANGLE_DELTA_NEG, 3.0);
            //MIL.MpatSetAngle(pSData.m_milModel, MIL.M_SEARCH_ANGLE_DELTA_POS, 3.0);
            //MIL.MpatSetAngle(pSData.m_milModel, MIL.M_SEARCH_ANGLE_ACCURACY, 0.25);
            //================================================================================================

            // Preprocess the model.
            MIL.MpatPreprocModel(m_MilImage, pSData.m_milModel, MIL.M_DEFAULT);

            // Draw a box around the model in the model image.

            MIL.MpatDraw(MIL.M_DEFAULT, pSData.m_milModel, m_DisplayGraph,
                         MIL.M_DRAW_BOX, MIL.M_DEFAULT, MIL.M_ORIGINAL);

            // Save Image Bitmap

            return(true);
        }