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; }
bool CDetectLine::RunSelectTarget() { if(RunThreshold()) { try { select_shape(m_ConnectedRegions, &m_SelectedRegions, (((((HTuple("area").Append("roundness")).Append("row")).Append("column")).Append("ra")).Append("rb")), "and", (((((HTuple(m_minArea).Append(m_minRectangularity)).Append(m_minRow)).Append(m_minColumn)).Append(m_minRA)).Append(m_minRB)), (((((HTuple(m_maxArea).Append(m_maxRectangularity)).Append(m_maxRow)).Append(m_maxColumn)).Append(m_maxRA)).Append(m_maxRB))); fill_up(m_SelectedRegions, &m_RegionFillUp); gen_contour_region_xld(m_RegionFillUp, &m_RectangleContours, "border"); distance_pc(m_RectangleContours, m_ImageHeight/2, m_ImageWidth/2, &m_DistanceMin, &m_DistanceMax); if (HDevWindowStack::IsOpen()) { clear_window(HDevWindowStack::GetActive()); set_color(HDevWindowStack::GetActive(),"red"); disp_obj(m_RectangleContours, HDevWindowStack::GetActive()); set_color(HDevWindowStack::GetActive(),"green"); disp_cross(HDevWindowStack::GetActive(), m_ImageHeight/2, m_ImageWidth/2, 20, 0); //disp_cross(HDevWindowStack::GetActive(), m_ImageHeight/2 + m_DistanceMin, m_ImageWidth/2, 20, 0); } return true; } catch(...) { AfxMessageBox("检测直线失败!"); } } return false; }
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 main() { int plateau[4][7]; int tab[4][2]; fill_up(plateau); display(plateau); start(plateau,tab); }
int main() { int i; char **mpt; char *pt = "vitor"; fill_up(&mpt); for (i = 0; i < SIZET; i++) { printf("%d\n", i); mpt[i] = pt; } free(mpt); return 0; }
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 knnc(double *array_vec,int *nb_col,int *nb_row, int*k, int *corre_flag, double *dist, double *dist_bound) { int missing,i,j,ii; int count; double value; double *temp; double *row_nb; double ** array; int *miss_pos; int index; int *n_position; int* nb_neighboors; int min=0; int max=*k-1; array=dmatrix(*nb_row,*nb_col); /** contain the row numbers of the missing values **/ miss_pos=ivector(*nb_col, code_miss); /** contains the distances of the neighboors **/ temp=dvector(*k,code_miss); /** contains the row numbers of the neighboors **/ row_nb=dvector(*k,code_miss); /** initilize all the distances with the missing codes **/ init_dvector(dist, nb_row, code_miss); n_position=ivector(*nb_row, code_miss); /** positions of potential neighboors **/ nb_neighboors=ivector(1, code_miss); /** number of neighboors **/ /** coerce the vector into a two dimmensional array **/ vec_mat(array_vec,nb_row,nb_col,array); neighboors(array, nb_row, nb_col, n_position, nb_neighboors); if(*nb_neighboors==0) /** Stop if no neighboors **/ { error("No rows without missing values"); } else { if(*nb_neighboors<*k) /** If less than k neighboors give a warning **/ warning("Only %d neighboors could be used", *nb_neighboors); for(i=0;i<*nb_row;i++) { /** Check for missing values **/ missing=is_na(array[i],nb_col,miss_pos); if (missing==1 && miss_pos[*nb_col-1]==code_miss) /**at least one missing value at most nb_col**/ { if(*corre_flag==1 && miss_pos[*nb_col-2]!=code_miss) /** Give a warning if based on correlation and only one observation **/ warning("Could not estimate the missing values for the row %d\n One observation is not enough to compute the sample correlation", i+1); else { count=0; for(j=0;j<*nb_neighboors;j++) /** loop on the neighboors only **/ { index=n_position[j]; if(*corre_flag==0) value=distance(array[i],array[index],nb_col); /** compute the distance **/ else value=-correlation(array[i],array[index],nb_col); /** compute the correlation **/ if(value!=code_miss) { if (count<*k) /** store the first k **/ { temp[count]=value; row_nb[count]=index; count++; } else { quicksort2(temp,row_nb,&min,&max); /** sort the neighboors to keep the kth nearest **/ if (temp[*k-1]>value) /** keep it if the distance is shorter **/ { temp[*k-1]=value; row_nb[*k-1]=index; } } } } if(*corre_flag==0) { fill_up(array,row_nb,nb_col,k,i,miss_pos,temp, dist_bound); /** fill up the missing values by the averaging the distance**/ dist[i]=mean_vec(temp, k); /** Compute the average distances **/ } else { fill_up_corr(array,row_nb, nb_col, k,i, miss_pos, temp, dist_bound); /** fill up the missing values based on correlations**/ dist[i]=-mean_vec(temp, k); /** Compute the average distances **/ } init_dvector(row_nb, k, code_miss); /** initialize row_nb with missing codes **/ init_dvector(temp, k, code_miss); /** initialize temp with missing codes **/ } } else if(missing==1 && miss_pos[*nb_col-1]!=code_miss) warning("Could not estimate the missing values for the row %d\n The row only contains missing values", i+1); } } mat_vec(array_vec, nb_row, nb_col,array); /** recoerce the matrix into a vector **/ /** free the memory **/ free_dmatrix(array,*nb_row); Free(miss_pos); Free(temp); Free(row_nb); Free(n_position); Free(nb_neighboors); }
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; } }