机器视觉通用平台之数值计算算法工具

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CvBase;
using CWindowTool;
using HalconDotNet;
using System.IO;
using Newtonsoft.Json;

namespace CvImageTool.CalXY
{
    public class CalXYTool
    {
        public FileINI INI = new FileINI();
        public CalXYParam calXYParam;    //匹配参数
        private string cProcessSettingFilePath;     //当前流程配置文件的路径
        private string cImageOptSettingFilePath;    //当前算法参数文件路径
        public string PointSelect = "";       //图像输入参数选择项
        public string AngleSelect = "";       //仿射矩阵输入参数选择项
        private int cProcessIndex = -1;             //当前归属流程的索引
        private int cImageOptIndex = -1;            //当前归属算法的索引
        public HObject Image;
        public HTuple Point;
        public HTuple Angle;
        private List<BaseProcess> process;
        //private CWindows[] cCWindows;

        public CalXYTool(int cProcessIndex, int cImageOptIndex,
         string cProcessSettingFilePath, string cImageOptSettingFilePath,
         List<BaseProcess> processes)
        {
            this.cProcessSettingFilePath = cProcessSettingFilePath;
            this.cImageOptSettingFilePath = cImageOptSettingFilePath;
            this.cProcessIndex = cProcessIndex;
            this.cImageOptIndex = cImageOptIndex;
            this.process = processes;
            calXYParam = new CalXYParam();
            Image = new HObject();
        }

        /// <summary>
        /// 读取配置文件
        /// </summary>
        /// <param name="cProcessSettingFilePath"></param>
        /// <param name="cImgeOptSettingFilePath"></param>
        /// <returns></returns>
        public bool ReadFile(string cProcessDescription)
        {
            PointSelect = ""; AngleSelect = "";
            if (!File.Exists(cProcessSettingFilePath) || !File.Exists(cImageOptSettingFilePath)) return false;
            PointSelect = FileINI.ReadValueFromIniFile(cProcessDescription, "PointSelect", "", cProcessSettingFilePath);
            AngleSelect = FileINI.ReadValueFromIniFile(cProcessDescription, "AngleSelect", "", cProcessSettingFilePath);
            calXYParam = JsonConvert.DeserializeObject<CalXYParam>(File.ReadAllText(cImageOptSettingFilePath));
            return true;
        }


        /// <summary>
        /// 写配置文件
        /// </summary>
        /// <param name="cProcessSettingFilePath"></param>
        /// <param name="cImgeOptSettingFilePath"></param>
        /// <returns></returns>
        public bool WriteFile(string cProcessDescription)
        {
            FileINI.WriteValueFromIniFile(cProcessDescription, "PointSelect", PointSelect, cProcessSettingFilePath);
            FileINI.WriteValueFromIniFile(cProcessDescription, "AngleSelect", AngleSelect, cProcessSettingFilePath);
            var json = JsonConvert.SerializeObject(calXYParam, Formatting.Indented);
            File.WriteAllText(cImageOptSettingFilePath, json);
            return true;
        }

        public void Running(out HTuple DiffX, out HTuple DiffY, out HTuple DiffAngle)
        {
            DiffAngle = DiffX = DiffY = 99999.99;
            //查找点位
            string[] imageOptAndParamName = PointSelect.Split('_');
            ProcessTool.Instance.FindImageOpt(process[cProcessIndex], imageOptAndParamName[0], out BaseImageOpt byImageOpt, out int byIndex);
            if (byIndex >= 0)
                process[cProcessIndex].BaseImageOutParams[byIndex].GetHTupleValue(imageOptAndParamName[1], out Point);
            else
                Point = null;
            //查找角度
            imageOptAndParamName = AngleSelect.Split('_');
            ProcessTool.Instance.FindImageOpt(process[cProcessIndex], imageOptAndParamName[0], out byImageOpt, out byIndex);
            if (byIndex >= 0)
                process[cProcessIndex].BaseImageOutParams[byIndex].GetHTupleValue(imageOptAndParamName[1], out Angle);
            else
                Angle = null;
            //运行算法
            if (calXYParam.XEnable && Point != null && Point.Length >= 2)
                DiffX = Point[1] - calXYParam.X;
            else if (!calXYParam.XEnable && Point != null && Point.Length >= 2)
                DiffX = Point[1];
            if (calXYParam.YEnable && Point != null && Point.Length >= 2)
                DiffY = Point[0] - calXYParam.Y;
            else if (!calXYParam.YEnable && Point != null && Point.Length >= 2)
                DiffY = Point[0];
            if (calXYParam.XEnable && Angle != null && Angle.Length > 0)
                DiffAngle = Angle - calXYParam.Angle;
            else if (!calXYParam.AngleEnable && Angle != null && Angle.Length > 0)
                DiffAngle = Angle;
        }
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值