예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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());
            }
        }
예제 #3
0
 // 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) + "%)");
     }
 }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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);
            }
        }
예제 #6
0
        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);
                }
            }
        }
예제 #7
0
        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);
                }
            }
        }