/// <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; }
/// <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); }
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; }
/// <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; }
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; }
/// <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)); }
/// <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); }
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); }
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; }
/// <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; }
/// <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; }
/// <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); } }
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); }