引导定位软件-旋转中心标定
一 确定通讯协议
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
{
private static AlgorithmService instance = new AlgorithmService();
private AlgorithmService()
{
}
public static AlgorithmService Instance
{
get { return instance; }
}
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);
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}");
var mainForm = Application.OpenForms.OfType<MainForm>().FirstOrDefault();
HWindow_Final hWindow_Final = mainForm.hWindow_Final_CameraImg;
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");
}