int write_obj(int fd, object *obj_ptr, char perm_only ) { int n, cnt, cnt2=0, error=0; otag *op; n = write(fd, obj_ptr, sizeof(object)); if(n < sizeof(object)) merror("write_obj", FATAL); cnt = count_obj(obj_ptr, perm_only); n = write(fd, &cnt, sizeof(int)); if(n < sizeof(int)) merror("write_obj", FATAL); if(cnt > 0) { op = obj_ptr->first_obj; while(op) { if(!perm_only || (perm_only && (F_ISSET(op->obj, OPERMT)))) { if(write_obj(fd, op->obj, perm_only) < 0) error = 1; cnt2++; } op = op->next_tag; } } if(cnt != cnt2 || error) return(-1); else return(0); }
bool CDetectLine::RunThreshold() { try { threshold(m_Image, &m_Region, m_minGray, m_maxGray); if (HDevWindowStack::IsOpen()) { clear_window(HDevWindowStack::GetActive()); set_color(HDevWindowStack::GetActive(),"red"); disp_obj(m_Region, HDevWindowStack::GetActive()); connection(m_Region, &m_ConnectedRegions); //为了设定参数方便,显示面积在m_MinCirleArea/10~m_MaxCirleArea*10(Pixel)的区域面积值 Hobject selectRegions; HTuple RegionCount, Area, Row, Column; select_shape(m_ConnectedRegions, &selectRegions, "area", "and", m_minArea/10, m_maxArea*10); count_obj(selectRegions, &RegionCount); area_center(selectRegions, &Area, &Row, &Column); set_color(HDevWindowStack::GetActive(),"blue"); for (int i=1; i<=RegionCount; i+=1) { set_tposition(HDevWindowStack::GetActive(), HTuple(Row[i-1]), HTuple(Column[i-1])); write_string(HDevWindowStack::GetActive(), Area[i-1].D()); } } } catch(...) { AfxMessageBox("二值化失败!"); return false; } return true; }
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; }
int write_object(FILE *fp, int num, object *obj) { int cnt; char perm_only; otag *op; perm_only = 0; fprintf(fp, "#begobj\n"); /* basic object format (excluding pointers) */ write_object_basic(fp, num, obj); fprintf(fp, "#endobj\n"); /* objects carried within objects */ cnt = count_obj(obj, perm_only); write_int(fp, cnt); if(cnt > 0) { op = obj->first_obj; while(op) { if(!perm_only || (perm_only && op->obj->flags[0] & 1)) write_object(fp, -1, op->obj); op = op->next_tag; } } /* end of complete object */ return(0); }
bool gvVisionTask_black::gvTask_inspect( Hobject image_src, Hobject *outRegion_defects ) { // Local iconic variables Hobject TMP_Region, Region1, RegionErosion1,ImageReduced; Hobject Image_meanSmall, Image_meanLarge, RegionDynThresh; Hobject ConnectedRegions, RegionFillUp, RegionErosion, ConnectedRegions1; Hobject SelectedRegions, RegionDilation1, RegionDilation; Hobject RegionDifference, obj_selected; // Local control variables HTuple Meancenter, Deviation, Meanouter, Deviation1; HTuple Index, Number; // reduce_domain(image_src, gvTask_GetROI()->gvROI_GetROI(), &ImageReduced); reduce_domain(image_src, gvTask_GetROI()->gvROI_GetROI(), &ImageReduced); threshold(ImageReduced, &Region1, 100, 255); fill_up(Region1, &Region1); erosion_circle(Region1, &RegionErosion1, 20); mean_image(ImageReduced, &Image_meanSmall, 2, 2); mean_image(ImageReduced, &Image_meanLarge, 20, 20); dyn_threshold(Image_meanSmall, Image_meanLarge, &RegionDynThresh, 5, "dark"); connection(RegionDynThresh, &ConnectedRegions); fill_up(ConnectedRegions, &RegionFillUp); erosion_circle(RegionFillUp, &RegionErosion, 1.5); connection(RegionErosion, &ConnectedRegions1); select_shape(ConnectedRegions1, &SelectedRegions, "area", "and", m_minBlackSpotArea, 5000); dilation_circle(SelectedRegions, &RegionDilation1, 2.5); intensity(RegionDilation1, Image_meanSmall, &Meancenter, &Deviation); dilation_circle(SelectedRegions, &RegionDilation, 5); difference(RegionDilation, SelectedRegions, &RegionDifference); intensity(RegionDifference, Image_meanSmall, &Meanouter, &Deviation1); gen_empty_obj(&(*outRegion_defects)); for (Index=0; Index<=(Meancenter.Num())-1; Index+=1) { select_obj(SelectedRegions, &obj_selected, Index+1); if (0 != ((HTuple(Meancenter[Index])-HTuple(Meanouter[Index]))<-30)) { concat_obj((*outRegion_defects), obj_selected, &(*outRegion_defects)); } } count_obj((*outRegion_defects), &Number); if(Number>m_maxBlackSpotCnt||Number<m_minBlackSpotCnt ) { return FALSE; } return TRUE; }
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; } }
void CDoProcess::DoProcess(CMData* pData,SubTestResult *testItem) { try { Hobject FindImage,ImageReduced,EllipseObj; Hobject ModelRegions, ConnectedRegions, SelectedRegions,ModelImages,SelectedRegionsSize,RegionClosing,RegionUnion,RegionFillUp,RegionOpening; Hlong Contrast = m_Parameters.m_Contrast; HTuple Row2, Column2, Radius2; Hobject regional_Internal,regional_Out; get_image_size (pData->m_Image, &Column2, &Row2); gen_ellipse(&EllipseObj, Row2/2, Column2/2, 0, m_Parameters.LongAxis, m_Parameters.ShortAxis); if (ShowObject&&pData->m_isDebug) { set_color(pData->m_ShowHWindow,"yellow"); disp_obj(EllipseObj,pData->m_ShowHWindow); } reduce_domain(pData->m_Image, EllipseObj, &ImageReduced); inspect_shape_model(ImageReduced, &ModelImages, &ModelRegions, 1, Contrast); connection(ModelRegions, &ConnectedRegions); //**============================================================== // **选择区域这条更改,原来默认是700,现在我想改成可调的,我现在就设的40 select_shape(ConnectedRegions, &SelectedRegionsSize, "area", "and", m_Parameters.Select_Shape_Size, 99999); // ** 添加这句union1 closing_circle (SelectedRegionsSize, &RegionClosing, 400.5); union1(RegionClosing, &RegionUnion); fill_up (RegionUnion, &RegionFillUp); opening_circle (RegionFillUp, &RegionOpening, m_Parameters.OutlierRemover+0.5); Hlong TempNumber; count_obj(RegionOpening,&TempNumber); if (TempNumber<1) { pData->m_isFail = true; testItem->m_bFailSubTest = true; if (pData->m_isDebug) { set_color(pData->m_ShowHWindow,"green"); set_tposition( pData->m_ShowHWindow,120, 0); #ifdef _ENGLISH write_string(pData->m_ShowHWindow,"Shell center not found"); #else write_string(pData->m_ShowHWindow,"圆中心未找到"); #endif } //pData->m_center_x=50; //pData->m_center_y=50; //pData->r_real=40; //return; } //*============================================================== double CenterRow, CenterColumn, CenterRadius; smallest_circle(RegionOpening, &CenterRow, &CenterColumn, &CenterRadius); Hobject circle; if ((m_Parameters.XMin<CenterColumn)&&(CenterColumn<m_Parameters.XMax)&&(m_Parameters.YMin<CenterRow)&&(CenterRow<m_Parameters.YMax)&&(CenterRadius<m_Parameters.RMax)&&(CenterRadius>m_Parameters.RMin)) { pData->m_center_x=CenterColumn; pData->m_center_y=CenterRow; pData->r_real=CenterRadius; set_color(pData->m_ShowHWindow,"cyan"); gen_circle(&circle, pData->m_center_y, pData->m_center_x, pData->r_real); disp_obj(circle,pData->m_ShowHWindow); } else { pData->m_isFail = true; testItem->m_bFailSubTest = true; pData->m_center_x=50; pData->m_center_y=50; pData->r_real=40; set_color(pData->m_ShowHWindow,"red"); gen_circle(&circle, pData->m_center_y, pData->m_center_x, pData->r_real); disp_obj(circle,pData->m_ShowHWindow); if (pData->m_isDebug) { set_color(pData->m_ShowHWindow,"green"); set_tposition( pData->m_ShowHWindow,5, 145); #ifdef _ENGLISH write_string(pData->m_ShowHWindow,"Fitted shell center not match the qualifications"); #else write_string(pData->m_ShowHWindow,"拟合得到的圆的中心坐标及半径与限定条件不符"); #endif } //return; } //set_color(pData->m_ShowHWindow,"red"); //Hobject circle,ContCircle; //gen_circle(&circle, pData->m_center_y, pData->m_center_x, pData->r_real); //disp_obj(circle,pData->m_ShowHWindow); } 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,"CenterHC23 parameter values error,please re-adjust"); #else write_string(pData->m_ShowHWindow,"CenterHC23程序参数值出错,请重新调节参数"); #endif } pData->m_isFail = true; testItem->m_bFailSubTest = true; pData->m_center_x=50; pData->m_center_y=50; pData->r_real=40; } }
void CDoProcess::DoProcess(CMData* pData,SubTestResult *testItem) { Hlong m_radius_inner=m_Parameters.radius_inner; Hlong m_radius_ext=m_Parameters.radius_ext; Hlong m_thred; // dev_update_off(...); only in hdevelop //Hobject Image=pData->m_Image; ///////// if (m_Parameters.radius_inner>m_Parameters.radius_ext) { m_thred=m_Parameters.radius_inner; m_Parameters.radius_inner=m_Parameters.radius_ext; m_Parameters.radius_ext=m_thred; } if (m_Parameters.radius_inner2>m_Parameters.radius_ext2) { m_thred=m_Parameters.radius_inner2; m_Parameters.radius_inner2=m_Parameters.radius_ext2; m_Parameters.radius_ext2=m_thred; } // Local iconic variables Hobject Image=pData->m_Image; // Local iconic variables Hobject Circle1, Circle2, RegionDifference_ext; Hobject Circle3, Circle4, RegionDifference_inner, ImageReduced_ext; Hobject ImageReduced_inner, ImageEmphasize_inner, ImageEmphasize_ext; Hobject Region_ext, Region_inner, RegionUnion, ConnectedRegions; Hobject SelectedRegions; // Local control variables HTuple Mean_ext, Deviation_ext; HTuple Mean_inner, Deviation_inner, Number; // Local control variables try { HTuple Row=pData->m_center_y; HTuple Column= pData->m_center_x; if (pData->m_isFail ) { Row=250; Column=330; } gen_circle(&Circle1, Row, Column, m_Parameters.radius_ext); gen_circle(&Circle2, Row, Column, m_Parameters.radius_inner); difference(Circle1, Circle2, &RegionDifference_ext); gen_circle(&Circle3, Row, Column,m_Parameters.radius_ext2); gen_circle(&Circle4, Row, Column, m_Parameters.radius_inner2); difference(Circle3, Circle4, &RegionDifference_inner); ////////////////////////// set_color(pData->m_ShowHWindow,"green"); disp_region(Circle1,pData->m_ShowHWindow); disp_region(Circle2,pData->m_ShowHWindow); disp_region(Circle3,pData->m_ShowHWindow); disp_region(Circle4,pData->m_ShowHWindow); set_color(pData->m_ShowHWindow,"red"); /////////////////////////////// reduce_domain(Image, RegionDifference_ext, &ImageReduced_ext); reduce_domain(Image, RegionDifference_inner, &ImageReduced_inner); //*端面检测************** emphasize(ImageReduced_inner, &ImageEmphasize_inner, m_Parameters.radius_ext_empha_size, m_Parameters.radius_ext_empha_size, m_Parameters.radius_inner2_enhance); emphasize(ImageReduced_ext, &ImageEmphasize_ext, m_Parameters.radius_ext_empha_size, m_Parameters.radius_ext_empha_size, m_Parameters.radius_inner2_enhance); intensity(RegionDifference_ext, Image, &Mean_ext, &Deviation_ext); intensity(RegionDifference_inner, Image, &Mean_inner, &Deviation_inner); threshold(ImageEmphasize_ext, &Region_ext, 0,m_Parameters.radius_ext2_thred );//Mean_ext-30 fast_threshold(ImageReduced_inner, &Region_inner, 0,m_Parameters.radius_ext2_thred , 1);//Mean_inner-30 union2(Region_ext, Region_inner, &RegionUnion); connection(RegionUnion, &ConnectedRegions); select_shape(ConnectedRegions, &SelectedRegions, "area", "and", m_Parameters.ARMin, 99999); count_obj(SelectedRegions, &Number); /////////////////////////////////////////////////*/ // Number_QiPao=1; if ((Number<=0)) { ; //pData->m_isFail= false; //testItem->m_bFailSubTest = false; } else { pData->m_isFail = true; testItem->m_bFailSubTest = true; //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,pData->m_ShowHWindow); //disp_circle(pData->m_ShowHWindow,Row,Column,85); } } catch (HException &except) { pData->m_isFail = true; testItem->m_bFailSubTest = true; //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; } }