public void AffineTransPoint() { TransLocationCross.Clear(); ShapeMatchResult matchResult = Shape.OutputResult; for (int i = 0; i < matchResult.Count; i++) { HHomMat2D mat2d = new HHomMat2D(); mat2d.VectorAngleToRigid(Shape.ModelImgRow, Shape.ModelImgCol, Shape.ModelimgAng, matchResult.Row[i].D, matchResult.Col[i].D, matchResult.Angle[i].D); PointF[] fs = Array.ConvertAll <Cross, PointF>(locationCross.GetAllPointFs(), e => e.Pixel); HTuple tx, ty; HOperatorSet.AffineTransPoint2d(mat2d, Array.ConvertAll <PointF, double>(fs, e => e.Y).ToArray(), Array.ConvertAll <PointF, double>(fs, e => e.X).ToArray(), out ty, out tx); for (int m = 0; m < locationCross.Count; m++) { Cross cross = new Cross(); cross.Pixel = new PointF(tx[m].F, ty[m].F); cross.Angle = matchResult.Angle[m].D; cross.Color = "green"; TransLocationCross.Add(cross); } } }
public Point3[] FindTempleteModel(int caneraId, int modelId) { CameraMgr.Inst[caneraId].CameraSoft(); if (CameraMgr.Inst[caneraId].WaiteGetImage(1000) == false) { Tool.Shapes[caneraId].OutputResult.Count = 0; return(new Point3[0]); } lock (locker) { HImage image = CameraMgr.Inst[caneraId].GetCurrentImage(); List <Point3> list = new List <Point3>(); try { if (Tool.Shapes[modelId].InputImg != null) { Tool.Shapes[modelId].InputImg.Dispose(); } Tool.Shapes[modelId].InputImg = image; Tool.Shapes[modelId].FindModel(); ShapeMatchResult match = Tool.Shapes[modelId].OutputResult; if (mainCamera[modelId] != null) { mainCamera[modelId].ReDraw(); } if (match.Count > 0) { float row = CameraMgr.Inst[modelId].ImageSize.Height / 2f; float col = CameraMgr.Inst[modelId].ImageSize.Width / 2f; for (int i = 0; i < match.Count; i++) { CalibPointToPoint calib = Tool.Calibs[caneraId]; PointF pf; calib.PixelPointToWorldPoint(new PointF(match.Col[i].F, match.Row[i].F), out pf, new PointF(col, row), new PointF()); Point3 point = new Point3() { X = pf.X, Y = pf.Y, R = match.Angle.TupleDeg()[i].F }; list.Add(point); } } } finally { } return(list.ToArray()); } }
// Debugging public void OnGUI() { if (guiInfo == true) { ShapeMatchResult result = GetMatch(shapeA, shapeB, type); GUI.Label(new Rect(0, 0, 500, 500), "Points Count: " + shapeA.pointsIn.Count + " + " + shapeB.pointsIn.Count + " = " + result.allPoints); GUI.Label(new Rect(0, 20, 500, 500), "Points Similarity: " + result.pointsIn + " (" + (int)(result.percentage * 100) + "%)"); } }
private void button13_Click(object sender, EventArgs e) { try { ShapeMatchResult OutPutResults = FindShapeModel(); int imgWidth, imgHeight; shapeXLDModel.InputImg.GetImageSize(out imgWidth, out imgHeight); float x = 0, y = 0; bool flag = false; if (OutPutResults.Count > 0) { PointF matchPoint = new PointF((float)OutPutResults.Col[0].F, (float)OutPutResults.Row[0].F); PointF machinePoint; PointF imgReferPoint = new PointF(imgWidth / 2f, imgHeight / 2f); PointF CurrentLocation = new PointF(); CurrentLocation.X = CalibSetData.PlatformMove.AxisPosition[0]; CurrentLocation.Y = CalibSetData.PlatformMove.AxisPosition[1]; CalibSetData.Calib.PixelPointToWorldPoint(matchPoint, out machinePoint, imgReferPoint, CurrentLocation); x = machinePoint.X; y = machinePoint.Y; flag = true; } if (flag == false) { MessageBox.Show("无匹配结果"); } else { { string info = "分数:" + OutPutResults.Score[0].F.ToString("f2") + ",X偏移" + (x - CalibSetData.PlatformMove.AxisPosition[0]).ToString("f2") + ",Y偏移" + (y - CalibSetData.PlatformMove.AxisPosition[1]).ToString("f2") + ",是否移动到中心点?"; if (MessageBox.Show(info, "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { new Action(() => { CalibSetData.PlatformMove.AbsMoving((float)x, (float)y, calibHeight); CalibSetData.PlatformMove.WaitOnCompleteMoving(); Thread.Sleep(300); FindShapeModel(); }).BeginInvoke(null, null); } } } } catch (Exception ex) { MessageBox.Show("定位失败:" + ex.Message); } }
public void MoveImgCross() { try { ShapeMatchResult OutPutResults = FindShapeModel(); int imgWidth, imgHeight; shapeXLDModel.InputImg.GetImageSize(out imgWidth, out imgHeight); PointF worldCoord = new PointF(); if (PlatformMove != null) { worldCoord = GetWorldCoord(); } float x = 0, y = 0; bool flag = false; if (OutPutResults.Count > 0) { PointF matchPoint = new PointF((float)OutPutResults.Col[0].F, (float)OutPutResults.Row[0].F); PointF machinePoint; PointF imgReferPoint = new PointF(imgWidth / 2f, imgHeight / 2f); PointF CurrentLocation = new PointF(); CurrentLocation.X = (float)worldCoord.X; CurrentLocation.Y = (float)worldCoord.Y; CalibratePP.PixelPointToWorldPoint(matchPoint, out machinePoint, imgReferPoint, CurrentLocation); x = machinePoint.X; y = machinePoint.Y; flag = true; } if (flag == false) { MessageBox.Show("无匹配结果"); } else { if (PlatformMove == null) { string info = "分数:" + OutPutResults.Score[0].F.ToString("f2") + ",X偏移" + (x - worldCoord.X).ToString("f2") + ",Y偏移" + (y - worldCoord.Y).ToString("f2") + "。"; MessageBox.Show(info, "", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { string info = "分数:" + OutPutResults.Score[0].F.ToString("f2") + ",X偏移" + (x - worldCoord.X).ToString("f2") + ",Y偏移" + (y - worldCoord.Y).ToString("f2") + ",是否移动到中心点?"; if (MessageBox.Show(info, "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { new Action(() => { PlatformMove.AbsMoving((float)x, (float)y, 0); PlatformMove.WaitOnCompleteMoving(); Thread.Sleep(300); FindShapeModel(); }).BeginInvoke(null, null); } } } } catch (Exception ex) { MessageBox.Show("定位失败:" + ex.Message); } }
private void AutoMoveAxisCalibrate() { worldCoords.Clear(); PointF world = GetWorldCoord(); worldCoords.Add(new PointF() { X = world.X - MoveStep, Y = world.Y }); worldCoords.Add(new PointF() { X = world.X, Y = world.Y - MoveStep }); worldCoords.Add(new PointF() { X = world.X + MoveStep, Y = world.Y }); worldCoords.Add(new PointF() { X = world.X, Y = world.Y + MoveStep }); worldCoords.Add(new PointF() { X = world.X + MoveStep, Y = world.Y + MoveStep }); worldCoords.Add(new PointF() { X = world.X + MoveStep, Y = world.Y - MoveStep }); worldCoords.Add(new PointF() { X = world.X - MoveStep, Y = world.Y + MoveStep }); worldCoords.Add(new PointF() { X = world.X - MoveStep, Y = world.Y - MoveStep }); worldCoords.Add(new PointF() { X = world.X, Y = world.Y }); bool IsClearCalibrateData = false; for (int i = 0; i < worldCoords.Count && IsCalibrationRun == true;) { PlatformMove.AbsMoving((float)worldCoords[i].X, (float)worldCoords[i].Y, 0); if (!PlatformMove.WaitOnCompleteMoving()) { continue; } Thread.Sleep(1000); ShapeMatchResult matchResult = FindShapeModel(); if (matchResult.Count > 0) { if (!IsClearCalibrateData) { CalibratePP.ClearCalibrationData(); IsClearCalibrateData = true; } CalibratePP.AddCalibratePoint(matchResult.Row[0].F, matchResult.Col[0].F, worldCoords[i].X, worldCoords[i].Y); } i++; Thread.Sleep(100); } if (IsCalibrationRun == true) { CalibratePP.BuildTransferMatrix(); IsCalibrationRun = false; if (CalibratePP.IsBuiltted) { MessageBox.Show("标定成功,像素误差" + CalibratePP.CalibrateError().ToString("f3"), "提示", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); } else { MessageBox.Show("标定失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); } } }
private void AutoMoveAxisCalibrate() { if (!GenMovePoints()) { IsCalibrationRun = false; return; } movePoints.Add(new PointF(CalibSetData.PlatformMove.AxisPosition[0], CalibSetData.PlatformMove.AxisPosition[1])); bool IsClearCalibrateData = false; for (int i = 0; i < movePoints.Count && IsCalibrationRun == true;) { CalibSetData.PlatformMove.AbsMoving(movePoints[i].X, movePoints[i].Y, calibHeight); if (!CalibSetData.PlatformMove.WaitOnCompleteMoving(5000)) { continue; } Thread.Sleep(1000); CalibSetData.GetImage.CameraSoft(); if (!CalibSetData.GetImage.WaiteGetImage(2000)) { i++; continue;; } ShapeMatchResult OutPutResults = FindShapeModel(); if (OutPutResults.Count == 0) { i++; continue; } if (OutPutResults.Count > 0) { if (!IsClearCalibrateData) { CalibSetData.Calib.ClearCalibrationData(); IsClearCalibrateData = true; } CalibSetData.Calib.AddCalibratePoint(OutPutResults.Row[0].F, OutPutResults.Col[0].F, movePoints[i].X, movePoints[i].Y); } i++; Thread.Sleep(100); } if (IsCalibrationRun == true) { CalibSetData.Calib.BuildTransferMatrix(); IsCalibrationRun = false; if (CalibSetData.Calib.IsBuiltted) { MessageBox.Show("标定成功,像素误差" + CalibSetData.Calib.CalibrateError().ToString("f3"), "提示", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); Product.Inst.Save(); } else { MessageBox.Show("标定失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); } } }