bool gvVisionImage_botcap_front::_insp_loc( Hobject image_src, Hobject *outRegion_loc) { // Local iconic variables Hobject ImageMean, region_thre, region_fillup; Hobject region_erosion, region_dilation, region_conn, region_sel; // Local control variables Hlong numRegions; gen_empty_obj(&(*outRegion_loc)); mean_image(image_src, &ImageMean, 31, 31); dyn_threshold(image_src, ImageMean, ®ion_thre, 5, "light"); fill_up(region_thre, ®ion_fillup); erosion_circle(region_fillup, ®ion_erosion, 5.5); dilation_circle(region_erosion, ®ion_dilation, 5.5); connection(region_dilation, ®ion_conn); select_shape(region_conn, ®ion_sel, "area", "and", m_minarea, 999999); count_obj(region_sel, &numRegions); if ( 1 == numRegions ) { disp_obj(ho_Image,hl_WindowID); disp_obj(region_sel,hl_WindowID); copy_obj(region_sel, &(*outRegion_loc), 1, 1); return true; } return false; }
void CDoProcess::DoProcess(CMData* pData,SubTestResult *testItem) { // Local iconic variables Hobject Image=pData->m_Image; Hlong m_thred_low1=m_Parameters.m_thred_low1; Hlong m_thred_high1=m_Parameters.m_thred_high1; Hlong m_thred_low2=m_Parameters.m_thred_low2; Hlong m_thred_high2=m_Parameters.m_thred_high2; Hlong m_thred; ///////// if (m_thred_low1>m_thred_high1) { m_thred=m_thred_low1; m_thred_low1=m_thred_high1; m_thred_high1=m_thred; } if (m_thred_low2>m_thred_high2) { m_thred=m_thred_low2; m_thred_low2=m_thred_high2; m_thred_high2=m_thred; } /////////////////////////////////////////////////////// // Local iconic variables Hobject Region, ConnectedRegions, SelectedRegions; Hobject RegionUnion, RegionFillUp, Contours, Rectangle1; Hobject Rectangle2, ImageReduced1, ImageReduced2, Region1; Hobject Region2, RegionDilation1, RegionErosion1, RegionDilation2; Hobject RegionErosion2; // Local control variables HTuple ModelID,Area;//Row1, Column1, Radius1; HTuple Row11, Column11, Row12, Column12; HTuple Row21, Column21, Row22, Column22; //////////////////////////////////////////////////////////// // Local control variables HTuple Row; HTuple Column; // dev_update_off(...); only in hdevelop try { ///Row_model_center = 237.659; //Column_model_center = 339.212; /*gen_circle(&Circle5, Row, Column,m_Parameters.radius_ext); gen_circle(&Circle6, Row, Column,m_Parameters.radius_inner); difference(Circle5, Circle6, &RegionDifference_median); reduce_domain(Image, RegionDifference_median, &ImageReduced_median); intensity(RegionDifference_median, Image, &Mean_median, &Deviation_median); fast_threshold(ImageReduced_median, &Region_median, m_Parameters.radius_inner_thred, 255, 1);//Mean_median*1.2 connection(Region_median, &ConnectedRegions_median); select_shape(ConnectedRegions_median, &SelectedRegions_median, "area", "and", m_Parameters.radius_ext_extract_size, 99999); union1(SelectedRegions_median, &RegionUnion_median); area_center(RegionUnion_median, &Area_baoChiJia, &Row_baoChiJia, &Column_baoChiJia);*/ //********************************************************** threshold(Image, &Region, 0, m_Parameters.radius_inner_thred); connection(Region, &ConnectedRegions); select_shape(ConnectedRegions, &SelectedRegions, "area", "and", m_Parameters.radius_ext_extract_size, 149999); union1(SelectedRegions, &RegionUnion); fill_up(RegionUnion, &RegionFillUp); area_center(RegionFillUp, &Area, &Row, &Column); /////////////////////////////////// /*if (!_access(m_Parameters.CenterOcrModelRegion.c_str(),0)) { wstring msg = _T("Set Region already Exit.OverWrite or Not?"); if (MessageBox(NULL,msg.c_str(),_T("ReadFile Error"),MB_OK||MB_CANCELTRYCONTINUE)==IDOK) { write_region(RegionFillUp,m_Parameters.CenterOcrModelRegion.c_str()); } } else*/ write_region(RegionFillUp,m_Parameters.CenterOcrModelRegion.c_str()); ///////////////////////////////////////// gen_contour_region_xld(RegionFillUp, &Contours, "border"); create_shape_model_xld(Contours, 1, -0.69, 0.79, "auto", "auto", "ignore_local_polarity", 5, &ModelID); //匹配数据 /*if (!_access(m_Parameters.CenterOcrModelName.c_str(),0)) { wstring msg = _T("Set Model already Exit.OverWrite or Not?"); if (MessageBox(NULL,msg.c_str(),_T("ReadFile Error"),MB_OK||MB_CANCELTRYCONTINUE)==IDOK) { write_shape_model(ModelID,m_Parameters.CenterOcrModelName.c_str()); } } else*/ write_shape_model(ModelID,m_Parameters.CenterOcrModelName.c_str()); //***************************************************************** Row11=m_Parameters.YMin1; Row12=m_Parameters.YMin1+m_Parameters.YMax1; Column11=m_Parameters.XMin1; Column12=m_Parameters.XMin1+m_Parameters.XMax1; Row21=m_Parameters.YMin2; Row22=m_Parameters.YMin2+m_Parameters.YMax2; Column21=m_Parameters.XMin2; Column22=m_Parameters.XMin2+m_Parameters.XMax2; gen_rectangle1(&Rectangle1, Row11, Column11, Row12, Column12); gen_rectangle1(&Rectangle2, Row21, Column21, Row22, Column22); reduce_domain(Image, Rectangle1, &ImageReduced1); reduce_domain(Image, Rectangle2, &ImageReduced2); threshold(ImageReduced1, &Region1, m_Parameters.m_thred_low1, m_Parameters.m_thred_high1); threshold(ImageReduced2, &Region2, m_Parameters.m_thred_low2, m_Parameters.m_thred_high2); dilation_circle(Region1, &RegionDilation1, 3.5); erosion_circle(RegionDilation1, &RegionErosion1, m_Parameters.region_erosion1_size); dilation_circle(Region2, &RegionDilation2, 3.5); erosion_circle(RegionDilation2, &RegionErosion2, m_Parameters.region_erosion2_size); //创建模板时 保存区域和区域图片。在提取区域时,因为正常运行时每次都要用,不能使用 /*if (!_access(m_Parameters.CenterOcrModelRegion1.c_str(),0)) { wstring msg = _T("Set Region already Exit.OverWrite or Not?"); if (MessageBox(NULL,msg.c_str(),_T("ReadFile Error"),MB_OK||MB_CANCELTRYCONTINUE)==IDOK) { write_region(RegionErosion1,m_Parameters.CenterOcrModelRegion1.c_str()); } } else*/ write_region(RegionErosion1,m_Parameters.CenterOcrModelRegion1.c_str()); /*if (!_access(m_Parameters.CenterOcrModelRegion2.c_str(),0)) { wstring msg = _T("Set Region already Exit.OverWrite or Not?"); if (MessageBox(NULL,msg.c_str(),_T("ReadFile Error"),MB_OK||MB_CANCELTRYCONTINUE)==IDOK) { write_region(RegionErosion2,m_Parameters.CenterOcrModelRegion2.c_str()); } } else*/ write_region(RegionErosion2,m_Parameters.CenterOcrModelRegion2.c_str()); ///////////////////////////////////////////////// // Number_QiPao=1; if (1) { //pData->m_isFail= false; //testItem->m_bFailSubTest = false; pData->m_center_y2=Row[0].D(); pData->m_center_x2=Column[0].D(); } else { //testItem->m_ErrorMsg = "Error No Find Center"; //testItem->m_ErrorY = 250; //testItem->m_ErrorX = 350; //testItem->m_ErrorR = 55; //set_color(pData->m_ShowHWindow,"red"); //disp_region(SelectedRegions_qiPao_extract,pData->m_ShowHWindow); //disp_circle(pData->m_ShowHWindow,Row_center,Column_center,85); } set_color(pData->m_ShowHWindow,"blue"); disp_obj(Contours,pData->m_ShowHWindow); set_color(pData->m_ShowHWindow,"green"); disp_region(Rectangle1,pData->m_ShowHWindow); disp_region(Rectangle2,pData->m_ShowHWindow); disp_region(RegionErosion1,pData->m_ShowHWindow); disp_region(RegionErosion2,pData->m_ShowHWindow); set_color(pData->m_ShowHWindow,"red"); /////// } catch (HException &except) { pData->m_isFail = true; testItem->m_bFailSubTest = true; pData->m_orientationPhi=0; //testItem->m_ErrorMsg = except.file; //testItem->m_ErrorMsg += " "; //testItem->m_ErrorMsg += except.line; //testItem->m_ErrorMsg += " "; //testItem->m_ErrorMsg += except.message; testItem->m_ErrorY = 1; testItem->m_ErrorX = 1; testItem->m_ErrorR = 4; } }
void CDoProcess::DoProcess(CMData* pData,SubTestResult *testItem) { try { Hobject image = pData->m_Image; Hobject ROI,Circle1,Circle2; if((pData->r_real+m_Parameters.Regional_Out-m_Parameters.ROIWidth)>0) { gen_circle(&Circle1, (pData->m_center_y), (pData->m_center_x), (pData->r_real+m_Parameters.Regional_Out)); gen_circle(&Circle2, (pData->m_center_y), (pData->m_center_x), pData->r_real+m_Parameters.Regional_Out-m_Parameters.ROIWidth); difference(Circle1, Circle2, &ROI); if (ShowObject&&pData->m_isDebug) { set_color(pData->m_ShowHWindow,"blue"); disp_obj(Circle1,pData->m_ShowHWindow); set_color(pData->m_ShowHWindow,"green"); disp_obj(Circle2,pData->m_ShowHWindow); } } else { gen_circle(&ROI, (pData->m_center_y), (pData->m_center_x), (pData->r_real+m_Parameters.Regional_Out)); if (ShowObject&&pData->m_isDebug) { set_color(pData->m_ShowHWindow,"blue"); disp_obj(ROI,pData->m_ShowHWindow); } } // Local iconic variables Hobject region_tai,BlackImageMean,WhiteImageMean; Hobject BlackPointDynThresh, BLACK_POINT, SeriousBlackPointDynThresh; Hobject SeriousBlackConnected, SERIOUS_BlackPoint; Hobject WhitePointDynThresh, WHITE_POINT, SeriousWhitePointDynThresh; Hobject SeriousWhiteConnected, SERIOUS_WhitePoint; Hlong Number; Hobject Dilation,ExpandedImage; reduce_domain(image, ROI, ®ion_tai); expand_domain_gray(region_tai, &ExpandedImage, 2); reduce_domain(ExpandedImage, ROI, ®ion_tai); //*=================================================================== //*找黑色划痕与污点 mean_image(region_tai, &BlackImageMean, m_Parameters.BlackMaskSize, m_Parameters.BlackMaskSize); //*找大范围黑缺陷,适用于缺陷浅以及数量比较多的情况,参数越细,误报越高 dyn_threshold(region_tai, BlackImageMean, &BlackPointDynThresh,m_Parameters.BlackPointDynThresh, "dark"); select_shape(BlackPointDynThresh, &BLACK_POINT, "area", "and", m_Parameters.BlackPointSize, 99999); count_obj(BLACK_POINT, &Number); if (Number) { //pData->m_ErrorRegist = BLACK_POINT; pData->m_isFail =true; testItem->m_bFailSubTest = true; //testItem->m_ErrorMsg = "BlackPoint error"; //return; if (pData->m_isDebug) { dilation_circle(BLACK_POINT,&Dilation,2.5); set_color(pData->m_ShowHWindow,"red"); disp_obj(Dilation,pData->m_ShowHWindow); } } //*找单一块极黑缺陷,适用于伤的比较深,污点比较黑的情况 dyn_threshold(region_tai, BlackImageMean, &SeriousBlackPointDynThresh,m_Parameters.SeriousBlackPointDynThresh, "dark"); connection(SeriousBlackPointDynThresh, &SeriousBlackConnected); select_shape(SeriousBlackConnected, &SERIOUS_BlackPoint, "area", "and",m_Parameters.SeriousBlackPointSize, 99999); count_obj(SERIOUS_BlackPoint, &Number); if (Number) { pData->m_isFail =true; testItem->m_bFailSubTest = true; if (pData->m_isDebug) { dilation_circle(SERIOUS_BlackPoint,&Dilation,2.5); set_color(pData->m_ShowHWindow,"red"); disp_obj(Dilation,pData->m_ShowHWindow); } } //*=================================================================== //*找白色划痕与污点 mean_image(region_tai, &WhiteImageMean, m_Parameters.WhiteMaskSize, m_Parameters.WhiteMaskSize); //*找大范围白缺陷 dyn_threshold(region_tai, WhiteImageMean, &WhitePointDynThresh, m_Parameters.WhitePointDynThresh, "light"); select_shape(WhitePointDynThresh, &WHITE_POINT, "area", "and", m_Parameters.WhitePointSize, 99999); count_obj(WHITE_POINT, &Number); if (Number) { //pData->m_ErrorRegist = WHITE_POINT; pData->m_isFail =true; testItem->m_bFailSubTest = true; //testItem->m_ErrorMsg = "WhitePoint error"; if (pData->m_isDebug) { dilation_circle(WHITE_POINT,&Dilation,2.5); set_color(pData->m_ShowHWindow,"yellow"); disp_obj(Dilation,pData->m_ShowHWindow); } } //*找单一块极白污点 dyn_threshold(region_tai, WhiteImageMean, &SeriousWhitePointDynThresh, m_Parameters.SeriousWhitePointDynThresh, "light"); connection(SeriousWhitePointDynThresh, &SeriousWhiteConnected); select_shape(SeriousWhiteConnected, &SERIOUS_WhitePoint, "area", "and",m_Parameters.SeriousWhitePointSize, 99999); count_obj(SERIOUS_WhitePoint, &Number); if (Number) { //pData->m_ErrorRegist = SERIOUS_WhitePoint; pData->m_isFail =true; testItem->m_bFailSubTest = true; //testItem->m_ErrorMsg = "SeriousWhitePoint error"; if (pData->m_isDebug) { dilation_circle(SERIOUS_WhitePoint,&Dilation,2.5); set_color(pData->m_ShowHWindow,"yellow"); disp_obj(Dilation,pData->m_ShowHWindow); } } Hobject RegionUnionBlack,RegionUnionWhite,RegionUnionWhole; union2(BLACK_POINT, SERIOUS_BlackPoint, &RegionUnionBlack); union2(WHITE_POINT, SERIOUS_WhitePoint, &RegionUnionWhite); union2(RegionUnionBlack, RegionUnionWhite, &RegionUnionWhole); //dilation_circle(RegionUnionWhole, &RegionDilation, 2.5); union2(RegionUnionWhole, pData->m_ErrorRegist, &RegionUnionWhole); pData->m_ErrorRegist=RegionUnionWhole; } catch (HException &except) { if (pData->m_isDebug) { set_color(pData->m_ShowHWindow,"green"); set_tposition( pData->m_ShowHWindow,25, 145); #ifdef _ENGLISH write_string(pData->m_ShowHWindow,"DynThreshed1.3 parameter values error,please re-adjust"); #else write_string(pData->m_ShowHWindow,"DynThreshed1.3程序参数值出错,请重新调节参数"); #endif } pData->m_isFail = true; testItem->m_bFailSubTest = true; } }