Example #1
0
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);

}
Example #2
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, &region_thre, 5, "light");
	fill_up(region_thre, &region_fillup);
	erosion_circle(region_fillup, &region_erosion, 5.5);
	dilation_circle(region_erosion, &region_dilation, 5.5);
	connection(region_dilation, &region_conn);
	select_shape(region_conn, &region_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;
}
Example #4
0
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);
}
Example #5
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;
}
Example #6
0
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, &region_tai);
	expand_domain_gray(region_tai, &ExpandedImage, 2);
	reduce_domain(ExpandedImage, ROI, &region_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;
	}

}
Example #7
0
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;

	}

}
Example #8
0
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;
  }
}