QQ登录

只需一步,快速开始

上位机通过CCD视觉测量孔径

[ 复制链接 ]
上位机通过CCD视觉测量孔径

上位机通过CCD视觉测量孔径

上位机通过CCD视觉测量孔径

上位机通过CCD视觉测量孔径

上位机通过CCD视觉测量孔径



用摄像机检测物体的孔径,很多场合都用的到,这个例程实现这一功能,结构单位为像素;
可事先自己标定或其他方式,得出像素与mm等长度单位关系
下面是关键代码
  1. void CMy123View::OnButton1()
  2. {
  3.         HObject  ho_Image, ho_Rims, ho_Holes, ho_Hole;
  4.         HTuple  hv_Row, hv_Column, hv_Radius, hv_Width;
  5.         HTuple  hv_Height, hv_hWnd, hv_Number, hv_i, hv_MinDistance;
  6.         HTuple  hv_MaxDistance, hv_SVal, hv_Ascent, hv_Descent;
  7.         HTuple  hv_Width1, hv_Height1;
  8.        
  9.         ReadImage(&ho_Image, "pic/rim.png");
  10.         if (HDevWindowStack::IsOpen())
  11.                 HalconCpp::CloseWindow(HDevWindowStack::Pop());
  12.         EdgesSubPix(ho_Image, &ho_Rims, "canny", 4, 20, 40);
  13.         SelectShapeXld(ho_Rims, &ho_Holes, "circularity", "and", 0.7, 1.0);
  14.         SortContoursXld(ho_Holes, &ho_Holes, "upper_left", "true", "row");
  15.         SmallestCircleXld(ho_Holes, &hv_Row, &hv_Column, &hv_Radius);
  16.         GetImageSize(ho_Image, &hv_Width, &hv_Height);
  17.         SetWindowAttr("background_color","black");
  18.         OpenWindow(0,0,hv_Width,hv_Height,(Hlong)m_Dlg.m_hWnd,"","",&hv_hWnd);
  19.         m_Dlg.SetWindowPos(NULL,0,0,hv_Width.I(),hv_Height.I(),SWP_NOZORDER|SWP_SHOWWINDOW);
  20.         HDevWindowStack::Push(hv_hWnd);
  21.         if (!HDevWindowStack::IsOpen())
  22.                 return;
  23.     DispObj(ho_Image, HDevWindowStack::GetActive());
  24.     SetColor(HDevWindowStack::GetActive(),"green");
  25.         CountObj(ho_Holes, &hv_Number);       
  26.         HTuple end_val11 = hv_Number;
  27.         HTuple step_val11 = 1;
  28.         for (hv_i=1; hv_i.Continue(end_val11, step_val11); hv_i += step_val11)
  29.         {
  30.                 SelectObj(ho_Holes, &ho_Hole, hv_i);
  31.                 DistancePc(ho_Hole, HTuple(hv_Row[hv_i-1]), HTuple(hv_Column[hv_i-1]), &hv_MinDistance,  &hv_MaxDistance);
  32.                 DispObj(ho_Hole, HDevWindowStack::GetActive());
  33.                 DispCross(hv_hWnd, HTuple(hv_Row[hv_i-1]), HTuple(hv_Column[hv_i-1]), 6, 0);
  34.                 TupleString(hv_MinDistance, ".3f", &hv_SVal);
  35.                 GetStringExtents(hv_hWnd, "min: "+hv_SVal, &hv_Ascent, &hv_Descent, &hv_Width1,  &hv_Height1);
  36.                 disp_message(hv_hWnd, "min: "+hv_SVal, "image", HTuple(hv_Row[hv_i-1])-(2*hv_Ascent),
  37.                         ((HTuple(hv_Column[hv_i-1])-HTuple(hv_Radius[hv_i-1]))-hv_Width1)-10, "black",  "true");
  38.                 disp_message(hv_hWnd, "max: "+(hv_MaxDistance.TupleString(".3f")), "image", HTuple(hv_Row[hv_i-1]),
  39.                         ((HTuple(hv_Column[hv_i-1])-HTuple(hv_Radius[hv_i-1]))-hv_Width1)-10, "black", "true");
  40.         }
  41.        
  42. }
复制代码


  1. void disp_message (HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem,
  2.                                    HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box)
  3. {
  4.         HTuple  hv_Red, hv_Green, hv_Blue, hv_Row1Part;
  5.         HTuple  hv_Column1Part, hv_Row2Part, hv_Column2Part, hv_RowWin;
  6.         HTuple  hv_ColumnWin, hv_WidthWin, hv_HeightWin, hv_MaxAscent;
  7.         HTuple  hv_MaxDescent, hv_MaxWidth, hv_MaxHeight, hv_R1;
  8.         HTuple  hv_C1, hv_FactorRow, hv_FactorColumn, hv_UseShadow;
  9.         HTuple  hv_ShadowColor, hv_Exception, hv_Width, hv_Index;
  10.         HTuple  hv_Ascent, hv_Descent, hv_W, hv_H, hv_FrameHeight;
  11.         HTuple  hv_FrameWidth, hv_R2, hv_C2, hv_DrawMode, hv_CurrentColor;
  12.        
  13.         GetRgb(hv_WindowHandle, &hv_Red, &hv_Green, &hv_Blue);
  14.         GetPart(hv_WindowHandle, &hv_Row1Part, &hv_Column1Part, &hv_Row2Part, &hv_Column2Part);
  15.         GetWindowExtents(hv_WindowHandle, &hv_RowWin, &hv_ColumnWin, &hv_WidthWin, &hv_HeightWin);
  16.         SetPart(hv_WindowHandle, 0, 0, hv_HeightWin-1, hv_WidthWin-1);
  17.        
  18.         if (hv_Row==-1)
  19.                 hv_Row = 12;
  20.         if (hv_Column==-1)
  21.                 hv_Column = 12;
  22.         if (hv_Color==HTuple())
  23.                 hv_Color = "";
  24.         hv_String = ((""+hv_String)+"").TupleSplit("\n");
  25.         GetFontExtents(hv_WindowHandle, &hv_MaxAscent, &hv_MaxDescent, &hv_MaxWidth, &hv_MaxHeight);
  26.         if (0 != (hv_CoordSystem==HTuple("window")))
  27.         {
  28.                 hv_R1 = hv_Row;
  29.                 hv_C1 = hv_Column;
  30.         }
  31.         else
  32.         {
  33.                 //Transform image to window coordinates
  34.                 hv_FactorRow = (1.*hv_HeightWin)/((hv_Row2Part-hv_Row1Part)+1);
  35.                 hv_FactorColumn = (1.*hv_WidthWin)/((hv_Column2Part-hv_Column1Part)+1);
  36.                 hv_R1 = ((hv_Row-hv_Row1Part)+0.5)*hv_FactorRow;
  37.                 hv_C1 = ((hv_Column-hv_Column1Part)+0.5)*hv_FactorColumn;
  38.         }
  39.         //
  40.         //Display text box depending on text size
  41.         hv_UseShadow = 1;
  42.         hv_ShadowColor = "gray";
  43.         if (0 != (HTuple(hv_Box[0])==HTuple("true")))
  44.         {
  45.                 hv_Box[0] = "#fce9d4";
  46.                 hv_ShadowColor = "#f28d26";
  47.         }
  48.         if (0 != ((hv_Box.TupleLength())>1))
  49.         {
  50.                 if (0 != (HTuple(hv_Box[1])==HTuple("true")))
  51.                 {
  52.                         //Use default ShadowColor set above
  53.                 }
  54.                 else if (0 != (HTuple(hv_Box[1])==HTuple("false")))
  55.                 {
  56.                         hv_UseShadow = 0;
  57.                 }
  58.                 else
  59.                 {
  60.                         hv_ShadowColor = ((const HTuple&)hv_Box)[1];
  61.                         //Valid color?
  62.                         try
  63.                         {
  64.                                 SetColor(hv_WindowHandle, HTuple(hv_Box[1]));
  65.                         }
  66.                         // catch (Exception)
  67.                         catch (HalconCpp::HException &HDevExpDefaultException)
  68.                         {
  69.                                 HDevExpDefaultException.ToHTuple(&hv_Exception);
  70.                                 hv_Exception = "Wrong value of control parameter Box[1] (must be a 'true', 'false', or a valid color string)";
  71.                                 throw HalconCpp::HException(hv_Exception);
  72.                         }
  73.                 }
  74.         }
  75.         if (HTuple(hv_Box[0])!=HTuple("false"))
  76.         {
  77.                 try
  78.                 {
  79.                         SetColor(hv_WindowHandle, HTuple(hv_Box[0]));
  80.                 }
  81.                 catch (HalconCpp::HException &HDevExpDefaultException)
  82.                 {
  83.                         HDevExpDefaultException.ToHTuple(&hv_Exception);
  84.                         hv_Exception = "Wrong value of control parameter Box[0] (must be a 'true', 'false', or a valid color string)";
  85.                         throw HalconCpp::HException(hv_Exception);
  86.                 }
  87.                 hv_String = (" "+hv_String)+" ";
  88.                 hv_Width = HTuple();
  89.                 HTuple end_val93 = (hv_String.TupleLength())-1;
  90.                 HTuple step_val93 = 1;
  91.                 for (hv_Index=0; hv_Index.Continue(end_val93, step_val93); hv_Index += step_val93)
  92.                 {
  93.                         GetStringExtents(hv_WindowHandle, HTuple(hv_String[hv_Index]), &hv_Ascent,
  94.                                 &hv_Descent, &hv_W, &hv_H);
  95.                         hv_Width = hv_Width.TupleConcat(hv_W);
  96.                 }
  97.                 hv_FrameHeight = hv_MaxHeight*(hv_String.TupleLength());
  98.                 hv_FrameWidth = (HTuple(0).TupleConcat(hv_Width)).TupleMax();
  99.                 hv_R2 = hv_R1+hv_FrameHeight;
  100.                 hv_C2 = hv_C1+hv_FrameWidth;
  101.                
  102.                 GetDraw(hv_WindowHandle, &hv_DrawMode);
  103.                 SetDraw(hv_WindowHandle, "fill");
  104.                 SetColor(hv_WindowHandle, hv_ShadowColor);
  105.                 if (0 != hv_UseShadow)
  106.                 {
  107.                         DispRectangle1(hv_WindowHandle, hv_R1+1, hv_C1+1, hv_R2+1, hv_C2+1);
  108.                 }
  109.                 SetColor(hv_WindowHandle, HTuple(hv_Box[0]));
  110.                 DispRectangle1(hv_WindowHandle, hv_R1, hv_C1, hv_R2, hv_C2);
  111.                 SetDraw(hv_WindowHandle, hv_DrawMode);
  112.         }
  113.        
  114.         HTuple end_val115 = (hv_String.TupleLength())-1;
  115.         HTuple step_val115 = 1;
  116.         for (hv_Index=0; hv_Index.Continue(end_val115, step_val115); hv_Index += step_val115)
  117.         {
  118.                 hv_CurrentColor = ((const HTuple&)hv_Color)[hv_Index%(hv_Color.TupleLength())];
  119.                 if (0 != (HTuple(hv_CurrentColor!=HTuple("")).TupleAnd(hv_CurrentColor!=HTuple("auto"))))
  120.                 {
  121.                         SetColor(hv_WindowHandle, hv_CurrentColor);
  122.                 }
  123.                 else
  124.                 {
  125.                         SetRgb(hv_WindowHandle, hv_Red, hv_Green, hv_Blue);
  126.                 }
  127.                 hv_Row = hv_R1+(hv_MaxHeight*hv_Index);
  128.                 SetTposition(hv_WindowHandle, hv_Row, hv_C1);
  129.                 WriteString(hv_WindowHandle, HTuple(hv_String[hv_Index]));
  130.         }
  131.         SetRgb(hv_WindowHandle, hv_Red, hv_Green, hv_Blue);
  132.         SetPart(hv_WindowHandle, hv_Row1Part, hv_Column1Part, hv_Row2Part, hv_Column2Part);
  133. }
复制代码


百度云附件:上位机通过CCD视觉测量孔径.rar   
  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

回复

使用道具 举报

大神点评(2)

编程吧网友  发表于 2019-4-15 22:55:15
学习..ghbxbxfjjxshnvhjvxvbc
来自: 微社区
回复

使用道具

点击查看
快速回复 返回列表 客服中心 搜索