首页 > 编程语言 >视觉定位引导算法相关总结

视觉定位引导算法相关总结

时间:2024-05-15 10:10:22浏览次数:21  
标签:定位 HOperatorSet HTuple hv double 算法 new 视觉 out

   1  #region ===========================两个相机=============================================
   2  public static double[] TwoPointLine(double Point1X, double Point1Y, double Point2X, double Point2Y)
   3  {
   4      double[] TwoPointPars = new double[3];
   5      try
   6      {
   7          if (Point1Y == Point2Y && Point1X == Point2X)
   8          {
   9 
  10              System.Windows.Forms.MessageBox.Show("两相同点,不能确定同一直线,请查实!"
  11                  , "错误"
  12                  , System.Windows.Forms.MessageBoxButtons.OK
  13                  , System.Windows.Forms.MessageBoxIcon.Exclamation
  14                  , System.Windows.Forms.MessageBoxDefaultButton.Button1);
  15              return null;
  16          }
  17          else if (Point1X == Point2X)
  18          {
  19              TwoPointPars[1] = 0;
  20              TwoPointPars[0] = 1;
  21              TwoPointPars[2] = -Point1X;
  22          }
  23          else
  24          {
  25              TwoPointPars[1] = 1;
  26              TwoPointPars[0] = -(Point2Y - Point1Y) / (Point2X - Point1X);
  27              TwoPointPars[2] = Point1X * (Point2Y - Point1Y) / (Point2X - Point1X) - Point1Y;
  28          }
  29 
  30      }
  31 
  32      catch (Exception ex)
  33      {
  34 
  35 
  36      }
  37      return TwoPointPars;
  38  }
  39  public static double[] PiontGradientLine(double PointX, double PointY, double[] TwoPointPars)
  40  {
  41      double[] PiontGradientPars = new double[3];
  42      if (TwoPointPars[0] == 0)
  43      {
  44          PiontGradientPars[1] = 0;
  45          PiontGradientPars[0] = 1;
  46          PiontGradientPars[2] = -PointX;
  47      }
  48      if (TwoPointPars[1] == 0)
  49      {
  50          PiontGradientPars[1] = 1;
  51          PiontGradientPars[0] = 0;
  52          PiontGradientPars[2] = -PointY;
  53      }
  54      if (TwoPointPars[0] != 0 && TwoPointPars[1] != 0)
  55      {
  56          PiontGradientPars[0] = TwoPointPars[1];
  57          PiontGradientPars[1] = -TwoPointPars[0];
  58          PiontGradientPars[2] = TwoPointPars[0] * PointY - TwoPointPars[1] * PointX;
  59      }
  60      return PiontGradientPars;
  61  }
  62  public static double[] CrossPointCordinate(double[] TwoPointPars, double[] PiontGradientPars)
  63  {
  64      double[] CrossCordinate = new double[2];
  65      if (TwoPointPars[1] == 0 && PiontGradientPars[1] == 0)
  66      {
  67          System.Windows.Forms.MessageBox.Show("两直线平行,无交点!");
  68          return null;
  69      }
  70      else if (TwoPointPars[1] == 0)
  71      {
  72          CrossCordinate[0] = -TwoPointPars[2];
  73          CrossCordinate[1] = -(PiontGradientPars[0] * CrossCordinate[0] + PiontGradientPars[2]) / PiontGradientPars[1];
  74      }
  75      else if (PiontGradientPars[1] == 0)
  76      {
  77          CrossCordinate[0] = -PiontGradientPars[2];
  78          CrossCordinate[1] = -(TwoPointPars[0] * CrossCordinate[0] + TwoPointPars[2]) / TwoPointPars[1];
  79      }
  80      else
  81      {
  82          if ((TwoPointPars[0] / TwoPointPars[1]) == (PiontGradientPars[0] / PiontGradientPars[1]))
  83          {
  84              System.Windows.Forms.MessageBox.Show("两直线平行,无交点!");
  85              return null;
  86          }
  87          else
  88          {
  89              CrossCordinate[0] = (TwoPointPars[2] - PiontGradientPars[2]) / (PiontGradientPars[0] - TwoPointPars[0]);
  90              CrossCordinate[1] = -(TwoPointPars[0] * CrossCordinate[0]) - TwoPointPars[2];
  91          }
  92      }
  93 
  94      return CrossCordinate;
  95  }
  96  public static double[] CrossPointCordinateDummy(double[] TwoPointPars, double[] PiontGradientPars)
  97  {
  98      double[] CrossCordinate = new double[2];
  99      if (TwoPointPars[1] == 0 && PiontGradientPars[1] == 0)
 100      {
 101          System.Windows.Forms.MessageBox.Show("两直线平行,无交点!");
 102          return null;
 103      }
 104      else if (TwoPointPars[1] == 0)
 105      {
 106          CrossCordinate[0] = -TwoPointPars[2];
 107          CrossCordinate[1] = -(PiontGradientPars[0] * CrossCordinate[0] + PiontGradientPars[2]) / PiontGradientPars[1];
 108      }
 109      else if (PiontGradientPars[1] == 0)
 110      {
 111          CrossCordinate[0] = -PiontGradientPars[2];
 112          CrossCordinate[1] = -(TwoPointPars[0] * CrossCordinate[0] + TwoPointPars[2]) / TwoPointPars[1];
 113      }
 114      else
 115      {
 116          if ((TwoPointPars[0] / TwoPointPars[1]) == (PiontGradientPars[0] / PiontGradientPars[1]))
 117          {
 118              System.Windows.Forms.MessageBox.Show("两直线平行,无交点!");
 119              return null;
 120          }
 121          else
 122          {
 123              CrossCordinate[0] = (TwoPointPars[1] * PiontGradientPars[2] - PiontGradientPars[1] * TwoPointPars[2]) / (TwoPointPars[0] * PiontGradientPars[1] - PiontGradientPars[0] * TwoPointPars[1]);
 124              CrossCordinate[1] = (TwoPointPars[0] * PiontGradientPars[2] - PiontGradientPars[0] * TwoPointPars[2]) / (PiontGradientPars[0] * TwoPointPars[1] - TwoPointPars[0] * PiontGradientPars[1]);
 125          }
 126      }
 127 
 128      return CrossCordinate;
 129  }
 130  public static double[] Calk(double theta, double[] PiontGradientPars)
 131  {
 132      double[] k = new double[2];
 133      if (PiontGradientPars[0] == 0)
 134      {
 135          k[0] = Math.Tan(theta);
 136          k[1] = Math.Tan(-theta);
 137      }
 138      else if (PiontGradientPars[1] == 0)
 139      {
 140          k[0] = Math.Tan((Math.PI / 2) - theta);
 141          k[1] = Math.Tan(-((Math.PI / 2) - theta));
 142      }
 143      else
 144      {
 145 
 146          if (Math.Round(1 + (Math.Tan(theta) * PiontGradientPars[0] / PiontGradientPars[1]), 5) != 0)
 147          {
 148              k[0] = (Math.Tan(theta) - (PiontGradientPars[0] / PiontGradientPars[1])) / (1 + (Math.Tan(theta) * PiontGradientPars[0] / PiontGradientPars[1]));
 149 
 150          }
 151          else
 152          {
 153              k[0] = double.PositiveInfinity;
 154          }
 155          if (Math.Round(1 - (Math.Tan(theta) * PiontGradientPars[0] / PiontGradientPars[1]), 5) != 0)
 156          {
 157              k[1] = (-(PiontGradientPars[0] / PiontGradientPars[1]) - Math.Tan(theta)) / (1 - (Math.Tan(theta) * PiontGradientPars[0] / PiontGradientPars[1]));
 158          }
 159          else
 160          {
 161              k[1] = double.PositiveInfinity;
 162          }
 163      }
 164      return k;
 165  }
 166  public static double[] Pointk(double PointX, double PointY, double k)
 167  {
 168      double[] PiontkPars = new double[3];
 169      if (double.IsInfinity(k))
 170      {
 171          PiontkPars[0] = 1;
 172          PiontkPars[1] = 0;
 173          PiontkPars[2] = PointX;
 174      }
 175      else
 176      {
 177          double b = PointY - k * PointX;
 178          PiontkPars[0] = k;
 179          PiontkPars[1] = -1;
 180          PiontkPars[2] = b;
 181      }
 182      return PiontkPars;
 183  }
 184  public static double[] ConvertXY(double X10, double Y10, double X210, double Y210)
 185  {
 186      double[] CnvtXY = new double[2];
 187 
 188      CnvtXY[0] = X10 - X210;
 189      CnvtXY[1] = Y10 - Y210;
 190      return CnvtXY;
 191 
 192  }
 193  public static double[] Calcxcy(double x10, double y10, double x11, double y11, double theta)
 194  {
 195      double[] CrossPoints = new double[2];
 196      double[] TwoPointPars = TwoPointLine(x10, y10, x11, y11);
 197 
 198      double[] PiontGradientPars = PiontGradientLine((x10 + x11) / 2, (y10 + y11) / 2, TwoPointPars);
 199      double[] kk = Calk((Math.Abs(theta / 2)) * Math.PI / 180, PiontGradientPars);
 200      double[] PiontkPars1 = Pointk(x10, y10, kk[0]);
 201      double[] PiontkPars2 = Pointk(x10, y10, kk[1]);
 202      double[] CrossCordinate1 = CrossPointCordinateDummy(PiontkPars1, PiontGradientPars);
 203      double[] CrossCordinate2 = CrossPointCordinateDummy(PiontkPars2, PiontGradientPars);
 204      if (CrossCordinate1[1] < CrossCordinate2[1])
 205      {
 206          CrossPoints = CrossCordinate1;
 207      }
 208      if (CrossCordinate2[1] < CrossCordinate1[1])
 209      {
 210          CrossPoints = CrossCordinate2;
 211      }
 212      return CrossPoints;
 213  }
 214  public static double Caltheta(double x11, double y11, double CnX, double CnY)
 215  {
 216      double theta = 0;
 217      double thetaX = CnY;
 218      double thetaY = CnX;
 219      theta = computeAngle(x11, y11, x11 + CnX, y11 + CnY);
 220      return theta;
 221  }
 222  private static double computeAngle(double x1, double y1, double x2, double y2)
 223  {
 224      double thetaX = x2 - x1;
 225      double thetaY = y2 - y1;
 226      double angleOfLine = ((Math.Atan2((y2 - y1), (x2 - x1))) * 180) / Math.PI;
 227      return angleOfLine;
 228  }
 229  public static bool oppositeSigns(int x, int y)
 230  {
 231      return ((x ^ y) < 0);
 232  }
 233 
 234  #endregion
 235 
 236  #region ===========================单个相机============================================= 
 237 
 238  #region==================旋转中心方法====================
 239  //1. 两个点加一个旋转角度
 240  // (X0,Y0)为旋转中心,(X1,Y1) (X2,Y2)为工件在视野内旋转角度a(机器人旋转(使用前先转化为弧度))的前后座标
 241  //(Xt,Yt)为两点延长线
 242 
 243  public static double[] CalcCircleCenter(double x1, double y1, double x2, double y2, double a)
 244  {
 245      double[] dCircleCenter = new double[3];
 246      //两点之间距离
 247      double distance = Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
 248      double radius = distance / 2 * (Math.Sin(a * Math.PI / (2 * 180)));
 249      double k = radius / distance;
 250      double xt = (1 - k) * x1 + k * x2;
 251      double yt = (1 - k) * y1 + k * y2;
 252 
 253      dCircleCenter[0] = Math.Cos(Math.PI / 2 - a / 2) * (xt - x1) - Math.Sin(Math.PI / 2 - a / 2) * (yt - y1) + x1;
 254      dCircleCenter[1] = Math.Cos(Math.PI / 2 - a / 2) * (yt - y1) + Math.Sin(Math.PI / 2 - a / 2) * (xt - x1) + y1;
 255      dCircleCenter[2] = radius;
 256      return dCircleCenter;
 257  }
 258 
 259 
 260  /// <summary>
 261  /// 
 262  /// </summary>
 263  /// <param name="x">旋转中心的位置</param>
 264  /// <param name="y">旋转中心的位置</param>
 265  /// <param name="a">旋转角度</param>
 266  /// <param name="x1">旋转角度a后定位到产品位置</param>
 267  /// <param name="y1">旋转角度a后定位到产品位置</param>
 268  /// <param name="x0">基准位置</param>
 269  /// <param name="y0">基准位置</param>
 270  /// <returns></returns>
 271  public static double[] CalcCdxy(double x, double y, double a, double x1, double y1, double x0, double y0)
 272  {
 273      double[] cdxytheta = new double[3];
 274      //旋转后新位置
 275      double x_new = Math.Cos(a * Math.PI / 180) * (x1 - x) - Math.Sin(a * Math.PI) * (y1 - y) + x;
 276      double y_new = Math.Cos(a * Math.PI / 180) * (y1 - y) + Math.Sin(a * Math.PI) * (x1 - x) + y;
 277      cdxytheta[2] = 0;
 278      cdxytheta[0] = x_new - x0;
 279      cdxytheta[1] = y_new - y0;
 280      return cdxytheta;
 281  }
 282  #endregion
 283 
 284 
 285 
 286         //绘制直线
 287         public void FindLineCaliperTool(HTuple hv_ExpDefaultWinHandle, HObject ho_Image, HTuple hv_LineParams, ref HTuple hv_Parameter)
 288         {
 289             HObject ho_Contours, ho_Cross, ho_Contour;
 290             HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
 291             HTuple hv_MetrologyHandle = new HTuple(), hv_Index = new HTuple();
 292             HTuple hv_Row = new HTuple(), hv_Column = new HTuple();
 293             // Initialize local and output iconic variables 
 294             HOperatorSet.GenEmptyObj(out ho_Contours);
 295             HOperatorSet.GenEmptyObj(out ho_Cross);
 296             HOperatorSet.GenEmptyObj(out ho_Contour);
 297             hv_Parameter = new HTuple();
 298             try
 299             {
 300                 //******************************************卡尺工具**************************************
 301                 hv_Width.Dispose(); hv_Height.Dispose();
 302                 HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
 303                 hv_MetrologyHandle.Dispose();
 304                 HOperatorSet.CreateMetrologyModel(out hv_MetrologyHandle);
 305                 HOperatorSet.SetMetrologyModelImageSize(hv_MetrologyHandle, hv_Width, hv_Height);
 306                 hv_Index.Dispose();
 307                 HOperatorSet.AddMetrologyObjectGeneric(hv_MetrologyHandle, "line", hv_LineParams,
 308                     40, 3, 1, 30, new HTuple(), new HTuple(), out hv_Index);
 309 
 310                 //执行测量,获取边缘点集
 311                 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "yellow");
 312                 HOperatorSet.ApplyMetrologyModel(ho_Image, hv_MetrologyHandle);
 313                 ho_Contours.Dispose(); hv_Row.Dispose(); hv_Column.Dispose();
 314                 HOperatorSet.GetMetrologyObjectMeasures(out ho_Contours, hv_MetrologyHandle,
 315                     "all", "all", out hv_Row, out hv_Column);
 316                 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red");
 317                 ho_Cross.Dispose();
 318                 HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row, hv_Column, 6, 0.785398);
 319 
 320                 //获取最终测量数据和轮廓线
 321                 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
 322                 HOperatorSet.SetLineWidth(hv_ExpDefaultWinHandle, 1);
 323                 hv_Parameter.Dispose();
 324                 HOperatorSet.GetMetrologyObjectResult(hv_MetrologyHandle, "all", "all", "result_type",
 325                     "all_param", out hv_Parameter);
 326                 ho_Contour.Dispose();
 327                 HOperatorSet.GetMetrologyObjectResultContour(out ho_Contour, hv_MetrologyHandle,
 328                     "all", "all", 1.5);
 329                 //释放测量句柄
 330                 HOperatorSet.ClearMetrologyModel(hv_MetrologyHandle);
 331 
 332                 hv_Width.Dispose();
 333                 hv_Height.Dispose();
 334                 hv_MetrologyHandle.Dispose();
 335                 hv_Index.Dispose();
 336                 hv_Row.Dispose();
 337                 hv_Column.Dispose();
 338 
 339                 return;
 340 
 341                 hv_Width.Dispose();
 342                 hv_Height.Dispose();
 343                 hv_MetrologyHandle.Dispose();
 344                 hv_Index.Dispose();
 345                 hv_Row.Dispose();
 346                 hv_Column.Dispose();
 347 
 348                 return;
 349             }
 350             catch (HalconException HDevExpDefaultException)
 351             {
 352 
 353                 hv_Width.Dispose();
 354                 hv_Height.Dispose();
 355                 hv_MetrologyHandle.Dispose();
 356                 hv_Index.Dispose();
 357                 hv_Row.Dispose();
 358                 hv_Column.Dispose();
 359 
 360                 throw HDevExpDefaultException;
 361             }
 362         }
 363 
 364         //绘制一条直线直线
 365         public HObject DrawLine(HObject InputImage, HTuple HalconWindowHandle, ref HTuple FitLine)
 366         {
 367             HTuple htWidth, htHeight;
 368             HOperatorSet.GetImageSize(InputImage, out htWidth, out htHeight);
 369             HTuple r1, c1, r2, c2, angle;
 370             HObject hoLineRegion = new HObject();
 371             HOperatorSet.SetColor(HalconWindowHandle, "blue");
 372             HOperatorSet.GenEmptyObj(out hoLineRegion);
 373             DispMessage(HalconWindowHandle, "绘制直线", "image", 50, 50, "blue", "false");
 374             HOperatorSet.DrawLine(HalconWindowHandle, out r1, out c1, out r2, out c2);
 375             HOperatorSet.AngleLx(r1, c1, r2, c2, out angle);
 376             HTuple line = new HTuple(r1, c1, r2, c2);
 377             FindLineCaliperTool(HalconWindowHandle,InputImage,  line, ref FitLine);
 378             return hoLineRegion;
 379         }
 380 
 381         // //绘制两条直线直线
 382         public HObject[] DrawLines(HObject InputImage, HTuple HalconWindowHandle, ref HTuple FitLine1, ref HTuple FitLine2)
 383         {
 384             HObject[] LineRegions = new HObject[2];
 385             HOperatorSet.GenEmptyRegion(out LineRegions[0]);
 386             HOperatorSet.GenEmptyRegion(out LineRegions[1]);
 387             LineRegions[0] = DrawLine(InputImage, HalconWindowHandle, ref FitLine1);
 388             LineRegions[1] = DrawLine(InputImage, HalconWindowHandle, ref FitLine2);
 389             return LineRegions;
 390         }
 391 
 392         //绘制矩形框(Rectangle1)
 393         public void DrawRectangle1(HObject InputImage, HTuple HalconWindowHandle, out HObject Rectangle1)
 394         {
 395             HTuple r1, c1, r2, c2;
 396             HTuple height, width;
 397             HOperatorSet.GenEmptyObj(out Rectangle1);
 398             HOperatorSet.GetImageSize(InputImage, out width, out height);
 399             HOperatorSet.SetColor(HalconWindowHandle, "blue");
 400             HOperatorSet.DrawRectangle1Mod(HalconWindowHandle, width / 2 - 100, height / 2 - 100, width/2 + 100, height/2 + 100, out r1, out c1, out r2, out c2);
 401             HOperatorSet.GenRectangle1(out Rectangle1, r1, c1, r2, c2);
 402         }
 403         //绘制矩形框(Rectangle2)
 404         public void DrawRectangle2(HObject InputImage, HTuple HalconWindowHandle, out HObject Rectangle2)
 405         {
 406             HTuple r1, c1, ahi, length1, length2;
 407             HTuple height, width;
 408             HOperatorSet.GenEmptyObj(out Rectangle2);
 409             HOperatorSet.GetImageSize(InputImage, out width, out height);
 410             HOperatorSet.SetColor(HalconWindowHandle, "blue");
 411             HOperatorSet.DrawRectangle2Mod(HalconWindowHandle, 1 * height / 2, 2 * width / 5, 0, 1 * width / 10  , 1 * height / 10, out r1, out c1, out ahi, out length1, out length2);
 412             HOperatorSet.GenRectangle2(out Rectangle2, r1, c1, ahi, length1, length2);
 413         }
 414 
 415         //求两条直线
 416         //返回Line1直线得角度:参数Angle以弧度为单位返回角度-pi到pi
 417         public void TwoLineIntersection(HTuple Line1, HTuple Line2, ref HTuple IntersectionPoint)
 418         {
 419             //直线1到直线2夹角,与直线2到直线1夹角为相反数
 420             HTuple x, y, a, isOverLapping;
 421             //拟合出来直线后求出两个直线交点,以及一条直线的交点
 422             HOperatorSet.IntersectionLines(Line1[0], Line1[1], Line1[2], Line1[3],
 423                  Line2[0], Line2[1], Line2[2], Line2[3], out x, out y, out isOverLapping);
 424             HOperatorSet.AngleLx(Line1[0], Line1[1], Line1[2], Line1[3], out a);
 425             IntersectionPoint = new HTuple(x, y, a);
 426         }
 427         public void AffineLinePoints(HTuple Line, HTuple r1, HTuple c1, HTuple a1, HTuple r2, HTuple c2, HTuple a2, ref HTuple AffineLine)
 428         {
 429             HTuple htHomat = new HTuple();
 430             HTuple x1, y1, x2, y2;
 431             HOperatorSet.VectorAngleToRigid(r1, c1, a1, r2, c2, a2, out htHomat);
 432             HOperatorSet.AffineTransPoint2d(htHomat, Line[0], Line[1], out x1, out y1);
 433             HOperatorSet.AffineTransPoint2d(htHomat, Line[2], Line[3], out x2, out y2);
 434             AffineLine = new HTuple(x1, y1, x2, y2);
 435         }
 436 
 437         //Aniso模板      
 438         public void CreateAnisoModel(HTuple HalconWindowHandle, HObject InputImage, HObject hoTrainRegion, out HTuple hv_ModelID)
 439         {
 440             HObject ho_ModelImage = new HObject();
 441             HOperatorSet.GenEmptyObj(out ho_ModelImage);
 442             ho_ModelImage.Dispose();
 443             hv_ModelID = new HTuple();
 444             hv_ModelID.Dispose();
 445             string Message = "";
 446             try
 447             {
 448                 HOperatorSet.SetDraw(HalconWindowHandle, "margin");
 449                 if (InputImage == null)
 450                 {
 451                     Message = "图片不能为空,请输入图片";
 452                     DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
 453                     return;
 454                 }
 455 
 456                 if (hoTrainRegion == null)
 457                 {
 458                     Message = "训练区域不能为空,请输入图片";
 459                     DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
 460                     return;
 461                 }
 462                 HOperatorSet.GenEmptyObj(out ho_ModelImage);
 463                 ho_ModelImage.Dispose();
 464                 HOperatorSet.ReduceDomain(InputImage, hoTrainRegion, out ho_ModelImage);
 465                 HOperatorSet.CreateAnisoShapeModel(ho_ModelImage, "auto", -0.39, 0.79, "auto",
 466                    0.9, 1.1, "auto", 0.9, 1.1, "auto", "auto", "use_polarity", "auto", "auto",
 467                    out hv_ModelID);
 468                 if (hv_ModelID!= null)
 469                     DispMessage(HalconWindowHandle, "模板创建成功", "window", 12, 12, "green", "false");
 470                 else
 471                     DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
 472                 ho_ModelImage.Dispose();
 473             }
 474             catch (HalconException hal)
 475             {
 476                 Message = hal.Message;
 477                 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
 478                 ho_ModelImage.Dispose();
 479             }
 480         }
 481         //匹配Aniso
 482         public void FindAnisoModel(HTuple HalconWindowHandle, HObject InputImage, HObject hoSearchRegion, HTuple htModelID,HTuple htMarkNums, ref HTuple hv_Angle, ref HTuple hv_Row, ref HTuple hv_Column, ref HTuple hv_Score)
 483         {
 484             string Message = "";
 485             if (InputImage == null)
 486             {
 487                 Message = "图片不能为空,请输入图片";
 488                 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
 489                 return;
 490             }
 491             HObject hoReduceImage = new HObject();
 492             HTuple hv_ScaleR1 = new HTuple();
 493             HTuple hv_ScaleC1 = new HTuple();
 494             HOperatorSet.ReduceDomain(InputImage, hoSearchRegion, out hoReduceImage);
 495             HOperatorSet.FindAnisoShapeModel(hoReduceImage, htModelID, -0.39, 0.79, 0.9, 1.1,
 496         0.9, 1.1, 0.5, htMarkNums, 0.5, "least_squares", numLevels: 0, 0.9, out hv_Row, out hv_Column,
 497         out hv_Angle, out hv_ScaleR1, out hv_ScaleC1, out hv_Score);
 498             HObject ho_ModelContours = new HObject();
 499             HOperatorSet.GenEmptyObj(out ho_ModelContours);
 500             HOperatorSet.GetShapeModelContours(out ho_ModelContours, htModelID, 1);       //获取形状模型的轮廓
 501                DispShapeMatchResults(HalconWindowHandle, htModelID, hv_Score, hv_Row, hv_Column, hv_Angle, hv_ScaleR1, hv_ScaleC1, 0);
 502            // ResultShow(HalconWindowHandle,hv_Row, hv_Column, hv_Angle, hv_Score,  hoSearchRegion, ho_ModelContours);
 503         }
 504         //NCC模板
 505         public void CreateNccModel(HTuple HalconWindowHandle, HObject InputImage, HObject hoTrainRegion, out HTuple hv_ModelID)
 506         {
 507             HObject hoReduceImage = new HObject();
 508             hv_ModelID = "";
 509             string Message = "";
 510             try
 511             {
 512                 if (InputImage == null)
 513                 {
 514                     Message = "图片不能为空,请输入图片";
 515                     DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
 516                     return;
 517                 }
 518 
 519                 if (hoTrainRegion == null)
 520                 {
 521                     Message = "训练区域不能为空,请输入图片";
 522                     DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
 523                     return;
 524                 }
 525                 HOperatorSet.ReduceDomain(InputImage, hoTrainRegion, out hoReduceImage);
 526                 HOperatorSet.CreateNccModel(hoReduceImage, "auto", 0, 3.14 / 2, "auto", "use_polarity", out hv_ModelID);
 527                 if (hv_ModelID != null)
 528                     DispMessage(HalconWindowHandle, "模板创建成功", "window", 12, 12, "green", "false");
 529                 else
 530                     DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
 531 
 532             }
 533             catch (HalconException hal)
 534             {
 535                 Message = hal.Message;
 536                 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
 537             }
 538         }
 539 
 540         //标定
 541         //N Point标定
 542         public void CalibPoints(HTuple HalconWindowHandle, HObject InputImage, HTuple hv_PixRows, HTuple hv_PixColumns, HTuple hv_MachineRows, HTuple hv_MachineColumn, ref HTuple hv_Hommat2D)
 543         {
 544             try
 545             {
 546                 if (hv_PixRows.Length > 0)
 547                 {
 548                     HOperatorSet.VectorToHomMat2d(hv_PixRows, hv_PixColumns, hv_MachineRows, hv_MachineColumn, out hv_Hommat2D);
 549                     HOperatorSet.SetColor(HalconWindowHandle, "green");
 550                     HOperatorSet.DispObj(InputImage, HalconWindowHandle);
 551                     for (int i = 0; i < hv_PixRows.Length; i++)
 552                     {
 553                         HOperatorSet.DispCross(HalconWindowHandle, hv_PixRows[i], hv_PixColumns[i], 50, 0);
 554                     }
 555                 }
 556 
 557             }
 558             catch (HalconException hal)
 559             {
 560             }
 561         }
 562 
 563         //保存标定文件
 564         public void SaveCalibFile(string sProductName, string HomatName, HTuple htHomat2D, out string msg)
 565         {
 566             //获取文件
 567             string filepath = AppDomain.CurrentDomain.BaseDirectory + @"\NinePoints\" + sProductName + @"\";
 568             // string HomatName = "CalibNPoint" + CameraNO.ToString() + ".mat";
 569             //保存Homat2D
 570             HTuple hv_SerializedItemHandle = null;
 571             HTuple hv_FileHandle = null;
 572             msg = string.Empty;
 573             if (htHomat2D != null)
 574             {
 575                 try
 576                 {
 577                     AddFileManger(HomatName, filepath);
 578                     HOperatorSet.SerializeHomMat2d(htHomat2D, out hv_SerializedItemHandle);
 579                     HOperatorSet.OpenFile(filepath + HomatName, "output_binary", out hv_FileHandle);
 580                     HOperatorSet.FwriteSerializedItem(hv_FileHandle, hv_SerializedItemHandle);
 581                     HOperatorSet.CloseFile(hv_FileHandle);
 582                     msg = "Save CalibNPointTool Completed";
 583                 }
 584                 catch (HalconException hex)
 585                 {
 586                     msg = "Save CalibNPointTool Error: " + hex.Message;
 587                 }
 588             }
 589         }
 590 
 591         public void ResultShow(HTuple hv_ExpDefaultWinHandle, HTuple hv_Row, HTuple hv_Column, HTuple hv_Angle, HTuple hv_Score, HObject RectangleSearchArea, HObject ho_ModelContours)
 592         {
 593             HTuple hv_MovementOfObject;
 594             HOperatorSet.VectorAngleToRigid(0, 0, 0, hv_Row, hv_Column, hv_Angle, out hv_MovementOfObject);
 595             HObject ho_ModelAtNewPosition;
 596             HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ModelAtNewPosition, hv_MovementOfObject);
 597             //HOperatorSet.DispObj(ho_Image, ht_hWindowHandle_Tempalte);
 598             HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, "margin");      //只显示边框
 599             HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "blue");       //设置画笔的颜色及线宽
 600             HOperatorSet.SetLineWidth(hv_ExpDefaultWinHandle, 2);
 601             HOperatorSet.DispRegion(RectangleSearchArea, hv_ExpDefaultWinHandle);
 602             HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
 603             HOperatorSet.SetLineWidth(hv_ExpDefaultWinHandle, 1);        //设置线宽及颜色
 604             HOperatorSet.DispObj(ho_ModelAtNewPosition, hv_ExpDefaultWinHandle);
 605             ho_ModelAtNewPosition.Dispose();
 606             hv_MovementOfObject.UnpinTuple();
 607 
 608             HOperatorSet.DispRectangle2(hv_ExpDefaultWinHandle, hv_Row, hv_Column, hv_Angle, 50, 50);    //绘制图形框
 609             HOperatorSet.DispCross(hv_ExpDefaultWinHandle, hv_Row, hv_Column, 7, hv_Angle);  //绘制十字线
 610                                                                               //设置显示文字的样式
 611     
 612             //显示的对象只有边缘线,
 613             HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, "margin");
 614             //线宽用Line Width 指定 s
 615             HOperatorSet.SetLineWidth(hv_ExpDefaultWinHandle, 2);
 616             HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "blue");
 617 
 618             if (hv_Score.D > 0.6)
 619             {
 620 
 621                 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
 622                 HOperatorSet.DispObj(ho_ModelAtNewPosition, hv_ExpDefaultWinHandle);
 623                 DispMessage(hv_ExpDefaultWinHandle, ((((("Result: " + hv_Row) + new HTuple(", ")) + hv_Column) + new HTuple(",")) + "\r\n Score:") + (hv_Score * 100).TupleString(".2f") + "%", "window", 1, 1, "green", "false");
 624             }
 625             else
 626             {
 627                 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red");
 628                 HOperatorSet.DispObj(ho_ModelAtNewPosition, hv_ExpDefaultWinHandle);
 629                 DispMessage(hv_ExpDefaultWinHandle, ((((("Result: " + hv_Row) + new HTuple(", ")) + hv_Column) + new HTuple(",")) + "\r\n Score:") + (hv_Score * 100).TupleString(".2f") + "%", "window", 1, 1, "red", "false");
 630             }
 631         }
 632 
 633         //特征显示
 634         private void DispShapeMatchResults(HTuple hv_ExpDefaultWinHandle, HTuple hv_ModelID, HTuple hv_Score, HTuple hv_Row, HTuple hv_Column, HTuple hv_Angle, HTuple hv_ScaleR, HTuple hv_ScaleC, HTuple hv_Model)
 635         {
 636             HObject ho_ModelContours = null, ho_ContoursAffinTrans = null;
 637             HTuple hv_NumMatches = null, hv_Index = new HTuple();
 638             HTuple hv_Match = new HTuple(), hv_HomMat2DIdentity = new HTuple();
 639             HTuple hv_HomMat2DScale = new HTuple(), hv_HomMat2DRotate = new HTuple();
 640             HTuple hv_HomMat2DTranslate = new HTuple();
 641             HTuple hv_Model_COPY_INP_TMP = hv_Model.Clone();
 642             HTuple hv_ScaleC_COPY_INP_TMP = hv_ScaleC.Clone();
 643             HTuple hv_ScaleR_COPY_INP_TMP = hv_ScaleR.Clone();
 644             HTuple hv_ContoursCenter_Row = null;
 645             HTuple hv_ContoursCenter_Col = null;
 646             HTuple hv_ContoursCenter_Area = null;
 647             HTuple hv_ContoursCenter_Pointer = null;
 648             HOperatorSet.GenEmptyObj(out ho_ModelContours);
 649             HOperatorSet.GenEmptyObj(out ho_ContoursAffinTrans);
 650             hv_NumMatches = new HTuple(hv_Row.TupleLength());
 651             if ((int)(new HTuple(hv_NumMatches.TupleGreater(0))) != 0)
 652             {
 653                 if ((int)(new HTuple((new HTuple(hv_ScaleR_COPY_INP_TMP.TupleLength())).TupleEqual(
 654                     1))) != 0)
 655                 {
 656                     HOperatorSet.TupleGenConst(hv_NumMatches, hv_ScaleR_COPY_INP_TMP, out hv_ScaleR_COPY_INP_TMP);
 657                 }
 658                 if ((int)(new HTuple((new HTuple(hv_ScaleC_COPY_INP_TMP.TupleLength())).TupleEqual(
 659                     1))) != 0)
 660                 {
 661                     HOperatorSet.TupleGenConst(hv_NumMatches, hv_ScaleC_COPY_INP_TMP, out hv_ScaleC_COPY_INP_TMP);
 662                 }
 663                 if ((int)(new HTuple((new HTuple(hv_Model_COPY_INP_TMP.TupleLength())).TupleEqual(
 664                     0))) != 0)
 665                 {
 666                     HOperatorSet.TupleGenConst(hv_NumMatches, 0, out hv_Model_COPY_INP_TMP);
 667                 }
 668                 else if ((int)(new HTuple((new HTuple(hv_Model_COPY_INP_TMP.TupleLength()
 669                     )).TupleEqual(1))) != 0)
 670                 {
 671                     HOperatorSet.TupleGenConst(hv_NumMatches, hv_Model_COPY_INP_TMP, out hv_Model_COPY_INP_TMP);
 672                 }
 673                 for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_ModelID.TupleLength())) - 1); hv_Index = (int)hv_Index + 1)
 674                 {
 675                     ho_ModelContours.Dispose();
 676                     HOperatorSet.GetShapeModelContours(out ho_ModelContours, hv_ModelID.TupleSelect(
 677                         hv_Index), 1);
 678                     HTuple end_val18 = hv_NumMatches - 1;
 679                     HTuple step_val18 = 1;
 680                     for (hv_Match = 0; hv_Match.Continue(end_val18, step_val18); hv_Match = hv_Match.TupleAdd(step_val18))
 681                     {
 682                         if ((int)(new HTuple(hv_Index.TupleEqual(hv_Model_COPY_INP_TMP.TupleSelect(
 683                             hv_Match)))) != 0)
 684                         {
 685                             HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity);
 686                             HOperatorSet.HomMat2dScale(hv_HomMat2DIdentity, hv_ScaleR_COPY_INP_TMP.TupleSelect(
 687                                 hv_Match), hv_ScaleC_COPY_INP_TMP.TupleSelect(hv_Match), 0, 0, out hv_HomMat2DScale);
 688                             HOperatorSet.HomMat2dRotate(hv_HomMat2DScale, hv_Angle.TupleSelect(hv_Match),
 689                                 0, 0, out hv_HomMat2DRotate);
 690                             HOperatorSet.HomMat2dTranslate(hv_HomMat2DRotate, hv_Row.TupleSelect(
 691                                 hv_Match), hv_Column.TupleSelect(hv_Match), out hv_HomMat2DTranslate);
 692                             ho_ContoursAffinTrans.Dispose();
 693                             HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ContoursAffinTrans,
 694                                 hv_HomMat2DTranslate);
 695                             HOperatorSet.AreaCenterXld(ho_ContoursAffinTrans, out hv_ContoursCenter_Area, out hv_ContoursCenter_Row, out hv_ContoursCenter_Col, out hv_ContoursCenter_Pointer);
 696                             if (hv_Score.D > 0.6)
 697                             {
 698                                 
 699                                 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
 700                                 HOperatorSet.DispObj(ho_ContoursAffinTrans, hv_ExpDefaultWinHandle);
 701                                 DispMessage(hv_ExpDefaultWinHandle, ((((("Result: " + hv_Row) + new HTuple(", ")) + hv_Column) + new HTuple(",")) + "\r\n Score:") + (hv_Score * 100).TupleString(".2f") + "%", "window", 1, 1, "green", "false");
 702                             }
 703                             else
 704                             {
 705                                 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red");
 706                                 HOperatorSet.DispObj(ho_ContoursAffinTrans, hv_ExpDefaultWinHandle);
 707                                 DispMessage(hv_ExpDefaultWinHandle, ((((("Result: " + hv_Row) + new HTuple(", ")) + hv_Column) + new HTuple(",")) + "\r\n Score:") + (hv_Score * 100).TupleString(".2f") + "%", "window", 1, 1, "red", "false");
 708                             }
 709                         }
 710                     }
 711                 }
 712             }
 713         }
 714 
 715 
 716         //消息显示
 717         public void DispMessage(HTuple hv_ExpDefaultWinHandle, HTuple hv_String, HTuple hv_CoordSystem, HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box)
 718         {
 719             HTuple hv_M = null, hv_N = null, hv_Red = null;
 720             HTuple hv_Green = null, hv_Blue = null, hv_RowI1Part = null;
 721             HTuple hv_ColumnI1Part = null, hv_RowI2Part = null, hv_ColumnI2Part = null;
 722             HTuple hv_RowIWin = null, hv_ColumnIWin = null, hv_WidthWin = new HTuple();
 723             HTuple hv_HeightWin = null, hv_I = null, hv_RowI = new HTuple();
 724             HTuple hv_ColumnI = new HTuple(), hv_StringI = new HTuple();
 725             HTuple hv_MaxAscent = new HTuple(), hv_MaxDescent = new HTuple();
 726             HTuple hv_MaxWidth = new HTuple(), hv_MaxHeight = new HTuple();
 727             HTuple hv_R1 = new HTuple(), hv_C1 = new HTuple(), hv_FactorRowI = new HTuple();
 728             HTuple hv_FactorColumnI = new HTuple(), hv_UseShadow = new HTuple();
 729             HTuple hv_ShadowColor = new HTuple(), hv_Exception = new HTuple();
 730             HTuple hv_Width = new HTuple(), hv_Index = new HTuple();
 731             HTuple hv_Ascent = new HTuple(), hv_Descent = new HTuple();
 732             HTuple hv_W = new HTuple(), hv_H = new HTuple(), hv_FrameHeight = new HTuple();
 733             HTuple hv_FrameWidth = new HTuple(), hv_R2 = new HTuple();
 734             HTuple hv_C2 = new HTuple(), hv_DrawMode = new HTuple();
 735             HTuple hv_CurrentColor = new HTuple();
 736             HTuple hv_Box_COPY_INP_TMP = hv_Box.Clone();
 737             HTuple hv_Color_COPY_INP_TMP = hv_Color.Clone();
 738             HTuple hv_Column_COPY_INP_TMP = hv_Column.Clone();
 739             HTuple hv_Row_COPY_INP_TMP = hv_Row.Clone();
 740             HTuple hv_String_COPY_INP_TMP = hv_String.Clone();
 741             if ((int)(new HTuple(hv_Color_COPY_INP_TMP.TupleEqual(new HTuple()))) != 0)
 742             {
 743                 hv_Color_COPY_INP_TMP = "";
 744             }
 745             if ((int)(new HTuple(hv_Box_COPY_INP_TMP.TupleEqual(new HTuple()))) != 0)
 746             {
 747                 hv_Box_COPY_INP_TMP = "false";
 748             }
 749             //
 750             //
 751             //Check conditions
 752             //
 753             hv_M = (new HTuple(hv_Row_COPY_INP_TMP.TupleLength())) * (new HTuple(hv_Column_COPY_INP_TMP.TupleLength()
 754                 ));
 755             hv_N = new HTuple(hv_Row_COPY_INP_TMP.TupleLength());
 756             if ((int)((new HTuple(hv_M.TupleEqual(0))).TupleOr(new HTuple(hv_String_COPY_INP_TMP.TupleEqual(
 757                 new HTuple())))) != 0)
 758             {
 759 
 760                 return;
 761             }
 762             if ((int)(new HTuple(hv_M.TupleNotEqual(1))) != 0)
 763             {
 764                 //Multiple positions
 765                 //
 766                 //Expand single parameters
 767                 if ((int)(new HTuple((new HTuple(hv_Row_COPY_INP_TMP.TupleLength())).TupleEqual(
 768                     1))) != 0)
 769                 {
 770                     hv_N = new HTuple(hv_Column_COPY_INP_TMP.TupleLength());
 771                     HOperatorSet.TupleGenConst(hv_N, hv_Row_COPY_INP_TMP, out hv_Row_COPY_INP_TMP);
 772                 }
 773                 else if ((int)(new HTuple((new HTuple(hv_Column_COPY_INP_TMP.TupleLength()
 774                     )).TupleEqual(1))) != 0)
 775                 {
 776                     HOperatorSet.TupleGenConst(hv_N, hv_Column_COPY_INP_TMP, out hv_Column_COPY_INP_TMP);
 777                 }
 778                 else if ((int)(new HTuple((new HTuple(hv_Column_COPY_INP_TMP.TupleLength()
 779                     )).TupleNotEqual(new HTuple(hv_Row_COPY_INP_TMP.TupleLength())))) != 0)
 780                 {
 781                     throw new HalconException("Number of elements in Row and Column does not match.");
 782                 }
 783                 if ((int)(new HTuple((new HTuple(hv_String_COPY_INP_TMP.TupleLength())).TupleEqual(
 784                     1))) != 0)
 785                 {
 786                     HOperatorSet.TupleGenConst(hv_N, hv_String_COPY_INP_TMP, out hv_String_COPY_INP_TMP);
 787                 }
 788                 else if ((int)(new HTuple((new HTuple(hv_String_COPY_INP_TMP.TupleLength()
 789                     )).TupleNotEqual(hv_N))) != 0)
 790                 {
 791                     throw new HalconException("Number of elements in Strings does not match number of positions.");
 792                 }
 793                 //
 794             }
 795             //
 796             //Prepare window
 797             HOperatorSet.GetRgb(hv_ExpDefaultWinHandle, out hv_Red, out hv_Green, out hv_Blue);
 798             HOperatorSet.GetPart(hv_ExpDefaultWinHandle, out hv_RowI1Part, out hv_ColumnI1Part,
 799                 out hv_RowI2Part, out hv_ColumnI2Part);
 800             HOperatorSet.GetWindowExtents(hv_ExpDefaultWinHandle, out hv_RowIWin, out hv_ColumnIWin,
 801                 out hv_WidthWin, out hv_HeightWin);
 802             HOperatorSet.SetPart(hv_ExpDefaultWinHandle, 0, 0, hv_HeightWin - 1, hv_WidthWin - 1);
 803             //
 804             //Loop over all positions
 805             HTuple end_val89 = hv_N - 1;
 806             HTuple step_val89 = 1;
 807             for (hv_I = 0; hv_I.Continue(end_val89, step_val89); hv_I = hv_I.TupleAdd(step_val89))
 808             {
 809                 hv_RowI = hv_Row_COPY_INP_TMP.TupleSelect(hv_I);
 810                 hv_ColumnI = hv_Column_COPY_INP_TMP.TupleSelect(hv_I);
 811                 //Allow multiple strings for a single position.
 812                 if ((int)(new HTuple(hv_N.TupleEqual(1))) != 0)
 813                 {
 814                     hv_StringI = hv_String_COPY_INP_TMP.Clone();
 815                 }
 816                 else
 817                 {
 818                     //In case of multiple positions, only single strings
 819                     //are allowed per position.
 820                     //For line breaks, use \n in this case.
 821                     hv_StringI = hv_String_COPY_INP_TMP.TupleSelect(hv_I);
 822                 }
 823                 //Default settings
 824                 //-1 is mapped to 12.
 825                 if ((int)(new HTuple(hv_RowI.TupleEqual(-1))) != 0)
 826                 {
 827                     hv_RowI = 12;
 828                 }
 829                 if ((int)(new HTuple(hv_ColumnI.TupleEqual(-1))) != 0)
 830                 {
 831                     hv_ColumnI = 12;
 832                 }
 833                 //
 834                 //Split string into one string per line.
 835                 hv_StringI = ((("" + hv_StringI) + "")).TupleSplit("\n");
 836                 //
 837                 //Estimate extentions of text depending on font size.
 838                 HOperatorSet.GetFontExtents(hv_ExpDefaultWinHandle, out hv_MaxAscent, out hv_MaxDescent,
 839                     out hv_MaxWidth, out hv_MaxHeight);
 840                 if ((int)(new HTuple(hv_CoordSystem.TupleEqual("window"))) != 0)
 841                 {
 842                     hv_R1 = hv_RowI.Clone();
 843                     hv_C1 = hv_ColumnI.Clone();
 844                 }
 845                 else
 846                 {
 847                     //Transform image to window coordinates.
 848                     hv_FactorRowI = (1.0 * hv_HeightWin) / ((hv_RowI2Part - hv_RowI1Part) + 1);
 849                     hv_FactorColumnI = (1.0 * hv_WidthWin) / ((hv_ColumnI2Part - hv_ColumnI1Part) + 1);
 850                     hv_R1 = (((hv_RowI - hv_RowI1Part) + 0.5) * hv_FactorRowI) - 0.5;
 851                     hv_C1 = (((hv_ColumnI - hv_ColumnI1Part) + 0.5) * hv_FactorColumnI) - 0.5;
 852                 }
 853                 //
 854                 //Display text box depending on text size.
 855                 hv_UseShadow = 1;
 856                 hv_ShadowColor = "gray";
 857                 if ((int)(new HTuple(((hv_Box_COPY_INP_TMP.TupleSelect(0))).TupleEqual("true"))) != 0)
 858                 {
 859                     if (hv_Box_COPY_INP_TMP == null)
 860                         hv_Box_COPY_INP_TMP = new HTuple();
 861                     hv_Box_COPY_INP_TMP[0] = "#fce9d4";
 862                     hv_ShadowColor = "#f28d26";
 863                 }
 864                 if ((int)(new HTuple((new HTuple(hv_Box_COPY_INP_TMP.TupleLength())).TupleGreater(
 865                     1))) != 0)
 866                 {
 867                     if ((int)(new HTuple(((hv_Box_COPY_INP_TMP.TupleSelect(1))).TupleEqual("true"))) != 0)
 868                     {
 869                         //Use default ShadowColor set above
 870                     }
 871                     else if ((int)(new HTuple(((hv_Box_COPY_INP_TMP.TupleSelect(1))).TupleEqual(
 872                         "false"))) != 0)
 873                     {
 874                         hv_UseShadow = 0;
 875                     }
 876                     else
 877                     {
 878                         hv_ShadowColor = hv_Box_COPY_INP_TMP.TupleSelect(1);
 879                         //Valid color?
 880                         try
 881                         {
 882                             HOperatorSet.SetColor(hv_ExpDefaultWinHandle, hv_Box_COPY_INP_TMP.TupleSelect(
 883                                 1));
 884                         }
 885                         // catch (Exception) 
 886                         catch (HalconException HDevExpDefaultException1)
 887                         {
 888                             HDevExpDefaultException1.ToHTuple(out hv_Exception);
 889                             hv_Exception = new HTuple("Wrong value of control parameter Box[1] (must be a 'true', 'false', or a valid color string)");
 890                             throw new HalconException(hv_Exception);
 891                         }
 892                     }
 893                 }
 894                 if ((int)(new HTuple(((hv_Box_COPY_INP_TMP.TupleSelect(0))).TupleNotEqual("false"))) != 0)
 895                 {
 896                     //Valid color?
 897                     try
 898                     {
 899                         HOperatorSet.SetColor(hv_ExpDefaultWinHandle, hv_Box_COPY_INP_TMP.TupleSelect(
 900                             0));
 901                     }
 902                     // catch (Exception) 
 903                     catch (HalconException HDevExpDefaultException1)
 904                     {
 905                         HDevExpDefaultException1.ToHTuple(out hv_Exception);
 906                         hv_Exception = new HTuple("Wrong value of control parameter Box[0] (must be a 'true', 'false', or a valid color string)");
 907                         throw new HalconException(hv_Exception);
 908                     }
 909                     //Calculate box extents
 910                     hv_StringI = (" " + hv_StringI) + " ";
 911                     hv_Width = new HTuple();
 912                     for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_StringI.TupleLength()
 913                         )) - 1); hv_Index = (int)hv_Index + 1)
 914                     {
 915                         HOperatorSet.GetStringExtents(hv_ExpDefaultWinHandle, hv_StringI.TupleSelect(
 916                             hv_Index), out hv_Ascent, out hv_Descent, out hv_W, out hv_H);
 917                         hv_Width = hv_Width.TupleConcat(hv_W);
 918                     }
 919                     hv_FrameHeight = hv_MaxHeight * (new HTuple(hv_StringI.TupleLength()));
 920                     hv_FrameWidth = (((new HTuple(0)).TupleConcat(hv_Width))).TupleMax();
 921                     hv_R2 = hv_R1 + hv_FrameHeight;
 922                     hv_C2 = hv_C1 + hv_FrameWidth;
 923                     //Display rectangles
 924                     HOperatorSet.GetDraw(hv_ExpDefaultWinHandle, out hv_DrawMode);
 925                     HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, "fill");
 926                     //Set shadow color
 927                     HOperatorSet.SetColor(hv_ExpDefaultWinHandle, hv_ShadowColor);
 928                     if ((int)(hv_UseShadow) != 0)
 929                     {
 930                         HOperatorSet.DispRectangle1(hv_ExpDefaultWinHandle, hv_R1 + 1, hv_C1 + 1, hv_R2 + 1,
 931                             hv_C2 + 1);
 932                     }
 933                     //Set box color
 934                     HOperatorSet.SetColor(hv_ExpDefaultWinHandle, hv_Box_COPY_INP_TMP.TupleSelect(
 935                         0));
 936                     HOperatorSet.DispRectangle1(hv_ExpDefaultWinHandle, hv_R1, hv_C1, hv_R2,
 937                         hv_C2);
 938                     HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, hv_DrawMode);
 939                 }
 940                 //Write text.
 941                 for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_StringI.TupleLength())) - 1); hv_Index = (int)hv_Index + 1)
 942                 {
 943                     //Set color
 944                     if ((int)(new HTuple(hv_N.TupleEqual(1))) != 0)
 945                     {
 946                         //Wiht a single text position, each text line
 947                         //may get a different color.
 948                         hv_CurrentColor = hv_Color_COPY_INP_TMP.TupleSelect(hv_Index % (new HTuple(hv_Color_COPY_INP_TMP.TupleLength()
 949                             )));
 950                     }
 951                     else
 952                     {
 953                         //With multiple text positions, each position
 954                         //gets a single color for all text lines.
 955                         hv_CurrentColor = hv_Color_COPY_INP_TMP.TupleSelect(hv_I % (new HTuple(hv_Color_COPY_INP_TMP.TupleLength()
 956                             )));
 957                     }
 958                     if ((int)((new HTuple(hv_CurrentColor.TupleNotEqual(""))).TupleAnd(new HTuple(hv_CurrentColor.TupleNotEqual(
 959                         "auto")))) != 0)
 960                     {
 961                         //Valid color?
 962                         try
 963                         {
 964                             HOperatorSet.SetColor(hv_ExpDefaultWinHandle, hv_CurrentColor);
 965                         }
 966                         // catch (Exception) 
 967                         catch (HalconException HDevExpDefaultException1)
 968                         {
 969                             HDevExpDefaultException1.ToHTuple(out hv_Exception);
 970                             hv_Exception = ((("Wrong value of control parameter Color[" + (hv_Index % (new HTuple(hv_Color_COPY_INP_TMP.TupleLength()
 971                                 )))) + "] == '") + hv_CurrentColor) + "' (must be a valid color string)";
 972                             throw new HalconException(hv_Exception);
 973                         }
 974                     }
 975                     else
 976                     {
 977                         HOperatorSet.SetRgb(hv_ExpDefaultWinHandle, hv_Red, hv_Green, hv_Blue);
 978                     }
 979                     //Finally display text
 980                     hv_RowI = hv_R1 + (hv_MaxHeight * hv_Index);
 981                     HOperatorSet.SetTposition(hv_ExpDefaultWinHandle, hv_RowI, hv_C1);
 982                     HOperatorSet.WriteString(hv_ExpDefaultWinHandle, hv_StringI.TupleSelect(hv_Index));
 983                 }
 984             }
 985             //Reset changed window settings
 986             HOperatorSet.SetRgb(hv_ExpDefaultWinHandle, hv_Red, hv_Green, hv_Blue);
 987             HOperatorSet.SetPart(hv_ExpDefaultWinHandle, hv_RowI1Part, hv_ColumnI1Part, hv_RowI2Part,
 988                 hv_ColumnI2Part);
 989 
 990             return;
 991         }
 992 
 993         public  void AddFileManger(string fileName, string filePath)
 994         {
 995             if (!Directory.Exists(filePath))
 996             {
 997                 Directory.CreateDirectory(filePath);
 998             }
 999             if (!File.Exists(filePath + fileName))
1000             {
1001                 File.Create(filePath + fileName);
1002             }
1003         }
1004 
1005         public void CopyFile(string sourceFile, string disFile, string fileName)
1006         {
1007             if (!Directory.Exists(disFile))
1008             {
1009                 Directory.CreateDirectory(disFile);
1010             }
1011             File.Copy(sourceFile + fileName, disFile + fileName, true);
1012         }
1013 
1014         public void DelDirectory(string path)
1015         {
1016             FileAttributes attr = File.GetAttributes(path);
1017             if (attr == FileAttributes.Directory)
1018             {
1019                 if (Directory.Exists(path))
1020                 {
1021                     Directory.Delete(path, true);
1022                 }
1023             }
1024         }
1025 
1026         public void MoveFile(string sourceFile, string disFile)
1027         {
1028             Directory.Move(sourceFile, disFile);
1029         }
1030 
1031 
1032         public double[] CalMdxy(double x0, double y0, double x1, double y1)
1033         {
1034             double[] Mdxy = new double[2];
1035             Mdxy[0] = x1 - x0;
1036             Mdxy[1] = y1 - y0;
1037             return Mdxy;
1038         }
1039 
1040         //传进来的参数是角度
1041         public double[] CalCdxyθ(double stdx, double stdy, double Mdx, double Mdy, double angle)
1042         {
1043             angle = (angle * Math.PI) / 180;
1044             double[] xyθ = new double[3];
1045             xyθ[0] = (Math.Cos(angle) - 1) * stdx - Math.Sin(angle) * stdy + Mdx;
1046             xyθ[1] = (Math.Cos(angle) - 1) * stdy + Math.Sin(angle) * stdx + Mdy;
1047             xyθ[2] = angle * 180 / Math.PI;
1048             return xyθ;
1049         }
1050 
1051         //传进来的参数是角度
1052         public double[] CalStdxy(double Mdx, double Mdy, double con)
1053         {
1054             con = (con * Math.PI) / 180;
1055             double[] stdxy = new double[2];
1056             stdxy[0] = (-0.5) * (Mdx * (Math.Cos(con) - 1) + Mdy * (Math.Sin(con))) / (1 - Math.Cos(con));
1057             stdxy[1] = (0.5) * (Mdx * (Math.Sin(con)) - Mdy * (Math.Cos(con) - 1)) / (1 - Math.Cos(con));
1058             return stdxy;
1059         }
1060 
1061         public void SortHTuple(HTuple SortSelect, HTuple hv_Angle, HTuple hv_Row, HTuple hv_Column, out HTuple Angle, out HTuple Row, out HTuple Column)
1062         {
1063             Angle = new HTuple();
1064             Row = new HTuple();
1065             Column = new HTuple();
1066 
1067             HTuple midRow = new HTuple();
1068             HTuple midColumn = new HTuple();
1069             HTuple midAngle = new HTuple();
1070             HTuple MidIndices = new HTuple();
1071             if (SortSelect != "R")
1072             {
1073                 HOperatorSet.TupleSortIndex(hv_Row, out MidIndices);
1074                 for (int i = 0; i < hv_Row.Length; i++)
1075                 {
1076                     HTuple Index = MidIndices[i];
1077                     Row[i] = hv_Row[Index];
1078                     Column[i] = hv_Column[Index];
1079                     Angle[i] = hv_Angle[Index];
1080                 }
1081             }
1082             if (SortSelect != "C")
1083             {
1084                 HOperatorSet.TupleSortIndex(hv_Column, out MidIndices);
1085                 for (int i = 0; i < hv_Column.Length; i++)
1086                 {
1087                     HTuple Index = MidIndices[i];
1088                     Row[i] = hv_Row[Index];
1089                     Column[i] = hv_Column[Index];
1090                     Angle[i] = hv_Angle[Index];
1091                 }
1092             }
1093         }
1094   

 

标签:定位,HOperatorSet,HTuple,hv,double,算法,new,视觉,out
From: https://www.cnblogs.com/xingyuanzier/p/18193226

相关文章

  • 代码随想录算法训练营第第七天 | 454.四数相加II 、383. 赎金信 、15. 三数之和 、18
    454.四数相加II建议:本题是使用map巧妙解决的问题,好好体会一下哈希法如何提高程序执行效率,降低时间复杂度,当然使用哈希法会提高空间复杂度,但一般来说我们都是舍空间换时间,工业开发也是这样。题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.四数相加II.html......
  • 代码随想录算法训练营第七天 | 454.四数相加II 383.赎金信 15.三数和
    四数相加II题目链接文章讲解视频讲解时间复杂度o(n2)空间复杂度o(n)classSolution{public:intfourSumCount(vector<int>&nums1,vector<int>&nums2,vector<int>&nums3,vector<int>&nums4){unordered_map<int,int>tw......
  • 常见的排序算法——归并排序(三)
    本文记述了归并排序的3项改进和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想本文实现了《算法(第4版)》书中提到的3项改进,对小规模子数组使用插入排序。减少在小规模数组中的递归调用能改进整个算法。测试数组是否已经有序。任意有序的子数组算法......
  • 基于毫米波的人体跟踪和识别算法
    具体的软硬件实现点击http://mcu-ai.com/MCU-AI技术网页_MCU-AI准确的人类活动识别(HAR)是实现新兴的上下文感知应用程序的关键,这些应用程序需要了解和识别人类行为,例如监测独居的残疾人或老年人。传统上,HAR是通过环境传感器(例如,相机)或通过可穿戴设备(例如,具有惯性测量单元(IMU)的智......
  • 五大常用算法总结
    原文链接:https://blog.csdn.net/changyuanchn/article/details/51476281引言据说有人归纳了计算机的五大常用算法,它们是贪婪算法,动态规划算法,分治算法,回溯算法以及分支限界算法。虽然不知道为何要将这五个算法归为最常用的算法,但是毫无疑问,这五个算法是有很多应用场景的,最优化问......
  • arthas定位接口的耗时排查问题
    下载Arthas的jar包https://arthas.aliyun.com/上传jar包到你的服务器启动启动arthas在命令行下面执行(使用和目标进程一致的用户启动,否则可能attach失败):curl-Ohttps://arthas.aliyun.com/arthas-boot.jarjava-jararthas-boot.jar执行该程序的用户需要和目标进程......
  • 【强化学习】A grid world 值迭代算法 (value iterator algorithm)
    强化学习——值迭代算法代码是在jupyternotebook环境下编写只需要numpy和matplotlib包。此代码为学习赵世钰老师强化学习课程之后,按照公式写出来的代码,对应第四章第一节valueiteratoralgorithm可以做的实验:调整gama值观察策略的变化调整惩罚值(fa)的大小观察......
  • 绝对定位(absolute)居中问题:transform: translate(-50%);
     transform:translate(-50%); translate(50%)相当于translateX(50%),表示沿X轴方向平移元素自身宽度的50%。 绝对定位是最常见的问题是难以居中,所以可以改变元素的中心,来达到居中的效果position:absolute;left:50%;transform:translate(-50%); exposit......
  • 震撼视觉:全球冰川数据大屏揭示冰川之美与奥秘
    在浩瀚无垠的宇宙中,地球以其独特的蓝色光环吸引着人们的目光。而在这颗蓝色星球上,冰川这一大自然的杰作,更是以其壮美与神秘,让人们心驰神往。 从阿尔卑斯山脉的冰川到南极洲的冰盖,从格陵兰岛的冰山到喜马拉雅山脉的雪山,这些冰川在数据大屏上以高清画质呈现,仿佛让人置身于冰川世......
  • 单源最短路算法
    Dijkstra算法原理首先将所有点分为两类,确定和没确定最短路的点。首先我们可以知道,起点只能通过已经确定最短路的点去到其他点,所以我们可以不断的确定距离起点最近的点的路径长度,再用这个确定的点更新其他点到起点的最短路距离。此时找最近点为\(O(n)\),更新邻接点为\(O(m)\),......