引导定位软件-旋转中心标定

引导定位软件-旋转中心标定

一 确定通讯协议

location,1       // 定位模式
location,2,real_x,real_y,第几个点   // 平移九点标定模式
location,3,第几个点     // 旋转中心标定模式


location,3,1
location,3,2
location,3,3
location,3,4
location,3,5

二 解析上位机数据

    else if (GlobalParamters.SoftModel == 3)
    {
        // 如果是第一个点,则清空之前的数据
        if (Convert.ToInt32(msg.Split(',')[2]) == 1)
        {
            AlgorithmService.Instance.ClearRotateCali();
        }
         
    }

三 算法实现

        #region 旋转中心标定


    public HTuple ImageX_Rotate_List = new HTuple();
    public HTuple ImageY_Rotate_List = new HTuple();


    /// 
    /// 添加旋转标定的点
    /// 
    /// 
    /// 
    public void AppendCirclePoint(double imageX, double imageY)
    {

        ImageX_Rotate_List.Append(imageX);
        ImageY_Rotate_List.Append(imageY);

    }
    /// 
    /// 生成旋转中心标定
    /// 
    public void GenRotateCalibrationFile(out Double CenterX, out Double CenterY)
    {
        if (ImageX_Rotate_List.Length == 5)
        {

            HOperatorSet.GenContourPolygonXld(out HObject contour, ImageY_Rotate_List, ImageX_Rotate_List);
            HOperatorSet.FitCircleContourXld(contour, "geotukey", -1, 0, 0, 3, 2, out HTuple Row_C1, out HTuple Column_C1, out HTuple Radius_C1, out HTuple StartPhi_C1, out HTuple EndPhi_C1, out HTuple PointOrder_C1);

            HOperatorSet.ReadTuple(@"D:/九点标定.tup", out HTuple homMat2d);

            HOperatorSet.AffineTransPoint2d(homMat2d, Row_C1, Column_C1, out HTuple X_Center, out HTuple Y_Center);

            RotateCaliModel rotateCaliModel = new RotateCaliModel();
            rotateCaliModel.CenterX = X_Center.D;
            rotateCaliModel.CenterY = Y_Center.D;

            XmlSerializerHelper.WriteXML(rotateCaliModel, "D:\\旋转标定结果.xml", typeof(RotateCaliModel));
            CenterX = Column_C1.D;
            CenterY = Row_C1.D;
            MessageBox.Show("生成旋转中心成功!");
        }
        else {
            CenterX = 0;
            CenterY = 0;


        }


    }

    #endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HalconDotNet;

namespace WinForm之引导定位软件系统.Algorithm
{
    public class AlgorithmService
    {
        //1. 私有静态变量(在第四步供外界使用),创建类的实例
        //2. 私有构造函数,确保外部无法直接实例化(确保是单个实例)
        //3. 确定供外界调用的代码资源
        //4. 公开静态属性,供外界使用(把第一步类的实例,开放出去)
        //5. 外界使用

        //1. 私有静态变量(在第四步供外界使用),创建类的实例
        private static AlgorithmService instance = new AlgorithmService();



        //2. 私有构造函数,确保外部无法直接实例化(确保是单个实例)
        private AlgorithmService()
        {

        }

        //4. 公开静态属性,供外界使用(把第一步类的实例,开放出去)
        public static AlgorithmService Instance
        {
            get { return instance; }
        }



        //3. 确定供外界调用的代码资源
        public HalconAlgo halconAlgo = new HalconAlgo();


        /// 
        /// 清空九点标定数据
        /// 
        public void ClearNPCali()
        {
            halconAlgo.RealY_List =new HTuple();
            halconAlgo.RealX_List = new HTuple();

        }

        /// 
        /// 清空旋转标定数据
        /// 
        public void ClearRotateCali()
        {
            halconAlgo.ImageX_Rotate_List = new HTuple();
            halconAlgo.ImageY_Rotate_List = new HTuple();

        }

        public HTuple GetImageXList()
        {
            return halconAlgo.ImageX_List;
        }


        public HTuple GetImageYList()
        {
            return halconAlgo.ImageY_List;
        }

        public HTuple GetImageRotateXList()
        {
            return halconAlgo.ImageX_Rotate_List;
        }


        public HTuple GetImageRotateYList()
        {
            return halconAlgo.ImageY_Rotate_List;
        }



        /// 
        /// 检测圆心
        /// 
        /// 
        /// 
        /// 
        public void DetectCircle(HObject Image,out Double ImageX,out Double ImageY)
        {
            halconAlgo.DetectCircle(Image,out HTuple y,out HTuple x);

            ImageX = x.D;
            ImageY = y.D;
        }

        /// 
        /// 获取点的数量
        /// 
        /// 
        public int GetPointNum()
        {
            return halconAlgo.ImageY_List.Length;
        }

        /// 
        /// 获取旋转点的数量
        /// 
        /// 
        public int GetRotatePointNum()
        {
            return halconAlgo.ImageY_Rotate_List.Length;
        }


        /// 
        /// 添加点
        /// 
        public void AppendPoint(double realX, double realY, double imageX, double imageY)
        {
            halconAlgo.AppendPoint( realX,  realY,  imageX,  imageY);

        }
        /// 
        /// 添加点
        /// 
        public void AppendCirclePoint(double imageX, double imageY)
        {
            halconAlgo.AppendCirclePoint(imageX, imageY);

        }
        /// 
        /// 生成平移标定矩阵
        /// 
        public void GenNinePointCalibrationFile()
        {
            halconAlgo.GenNinePointCalibrationFile();
        }

        /// 
        /// 生成旋转标定
        /// 
        public void GenRotateCalibrationFile(out Double centerX, out Double centerY)
        {
            halconAlgo.GenRotateCalibrationFile(out  centerX,out  centerY);
        }


    }
}

四 流程实现

  // 一 获取圆的中心
  AlgorithmService.Instance.DetectCircle(info.Image, out double ImageX, out double ImageY);
  // 二 添加旋转标定点
  AlgorithmService.Instance.AppendCirclePoint(ImageX, ImageY);
  // 三 如果有了5个点,则进行标定结果生成

   Double centerX =0.0, centerY = 0.0;
  if (AlgorithmService.Instance.GetRotatePointNum() ==5)
  {
      AlgorithmService.Instance.GenRotateCalibrationFile(out  centerX, out  centerY);
  }

  Log.Info($" ImageX :{ImageX} ImageY :{ImageY}");

  // 四 显示每个点
  // 1.获取mainform
  var mainForm = Application.OpenForms.OfType<MainForm>().FirstOrDefault();
  // 2.获取窗口上的显示控件
  HWindow_Final hWindow_Final = mainForm.hWindow_Final_CameraImg;
  // 3.显示标定点
  hWindow_Final.HobjectToHimage(info.Image);
  HOperatorSet.GenCrossContourXld(out HObject cross, AlgorithmService.Instance.GetImageRotateYList(), AlgorithmService.Instance.GetImageRotateXList(), 30, 0);
  hWindow_Final.DispObj(cross, "red");
  if (AlgorithmService.Instance.GetRotatePointNum() == 5)
  {
      HOperatorSet.GenCrossContourXld(out HObject crossCenter, centerY, centerX, 30, 0);

      hWindow_Final.DispObj(crossCenter, "blue");
  }

你可能感兴趣的:(winform)