private void bOutputCailb_Click(object sender, EventArgs e) { if (CailbResult != null) { #region 导出到Excel表 int row = int.Parse(this.tJigRow.Text); // 行 int col = int.Parse(this.tJigCol.Text); // 列 double distX = float.Parse(this.tJigDx.Text); double distY = float.Parse(this.tJigDy.Text); // 计算 间距 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (CailbResult[i, j].Real_CircleCenter.X == 0 && CailbResult[i, j].Real_CircleCenter.Y == 0) { CailbResult[i, j].RightDist = 0; CailbResult[i, j].DownDist = 0; continue; } if (j != 0 && j < col)// 右间距 { if (CailbResult[i, 0].Real_CircleCenter.X != 0 && CailbResult[i, 0].Real_CircleCenter.Y != 0) { CailbResult[i, j].RightDist = CPKTools.GetDist(ref CailbResult[i, j].Real_CircleCenter, ref CailbResult[i, 0].Real_CircleCenter) - j * distX; } else { CailbResult[i, j].RightDist = 0; } } if (i != 0 && i < row)// 下间距 { if (CailbResult[0, j].Real_CircleCenter.X != 0 && CailbResult[0, j].Real_CircleCenter.Y != 0) { CailbResult[i, j].DownDist = CPKTools.GetDist(ref CailbResult[i, j].Real_CircleCenter, ref CailbResult[0, j].Real_CircleCenter) - i * distY; } else { CailbResult[i, j].DownDist = 0; } } } } CPKTools.SaveCailbReport(ref CailbResult, row, col); #endregion } }
private void bStartChkCailb_Click(object sender, EventArgs e) { if (Thd_Cailb == null || !Thd_Cailb.IsAlive) { Thd_Cailb = new Thread(() => { #region 开始测量 try { Form_Main.Instance.StartGrabImage(); int row = int.Parse(this.tJigRow.Text); // 行 int col = int.Parse(this.tJigCol.Text); // 列 CailbResult = new Jig_ResultItem[row, col]; PointF basePoint = new PointF(); basePoint.X = float.Parse(this.tCailbBaseX.Text); basePoint.Y = float.Parse(this.tCailbBaseY.Text); double distX = float.Parse(this.tJigDx.Text); double distY = float.Parse(this.tJigDy.Text); RectangleContour rect = (RectangleContour)Form_Main.Instance.imageSet.Roi[0].Shape; short rMin = short.Parse(this.upCircleRmin.Text); short rMax = short.Parse(this.upCircleRmax.Text); PointContour center = new PointContour(); double radius = 0; double gain = 1; double offset = 0; double cycle = 1; gain = double.Parse(this.tGainValue.Text); offset = double.Parse(this.tOffsetValue.Text); cycle = double.Parse(this.tHanldeCycle.Text); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { Jig_ResultItem item = new Jig_ResultItem(); item.MachinePos = this.chkPoint[i * col + j]; //item.MachinePos.X = (float)(basePoint.X + distX * j); //item.MachinePos.Y = (float)(basePoint.Y + distY * i); // 移动到目标位 Form_Main.Instance.XYGoPosTillStop(20 * 1000, item.MachinePos, variable); //Thread.Sleep(100); // 获得上相机图像 VisionImage image = Form_Main.Instance.GrabImage2View(Camera.CAM.Top); // 预处理 for (int time = 0; time < cycle; ++time) { image = Form_Main.Instance.GainOffset(image, gain, offset); } Algorithms.Copy(image, Form_Main.Instance.imageSet.Image); // 找圆 if (CPKTools.FindCircle(image, rect, rMin, rMax, ref center, ref radius, 0, 0, 0)) { item.Image_CircleCenter.X = (float)center.X; item.Image_CircleCenter.Y = (float)center.Y; item.Real_CircleCenter = Camera.CameraDefine.Instance[Camera.CAM.Top].ImagePt2WorldPt(item.MachinePos, center, 0); } image.Dispose(); CailbResult[i, j] = item; } } // 计算 间距 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (CailbResult[i, j].Real_CircleCenter.X == 0 && CailbResult[i, j].Real_CircleCenter.Y == 0) { CailbResult[i, j].RightDist = 0; CailbResult[i, j].DownDist = 0; continue; } if (j != 0 && j < col)// 右间距 { CailbResult[i, j].RightDist = CPKTools.GetDist(ref CailbResult[i, j].Real_CircleCenter, ref CailbResult[i, 0].Real_CircleCenter) - j * distX; } if (i != 0 && i < row)// 下间距 { CailbResult[i, j].DownDist = CPKTools.GetDist(ref CailbResult[i, j].Real_CircleCenter, ref CailbResult[0, j].Real_CircleCenter) - i * distY; } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } #endregion }); Thd_Cailb.Start(); } }