/// <summary>
        /// 此相机算法单元结果
        /// </summary>
        /// <param name="par"></param>
        /// <param name="baseParCalibrate"></param>
        /// <param name="fun"></param>
        public void GetCellResultValue(ParGetResultFromCell par, BaseParCalibrate baseParCalibrate, HashAction fun)
        {
            try
            {
                Hashtable           htResult = null;
                ParCellExeReference parCellExecuteReferenceForMult = baseParCalibrate.g_ParCellExecuteReferenceForMult;

                g_BaseDealComprehensive.DealComprehensivePosCell_ForTestRun(g_UCDisplayCamera, baseParCalibrate.g_ParCellExecuteReferenceForMult, parCellExecuteReferenceForMult.g_CellExecute_L, out htResult);//执行算法但不显示

                if (fun != null)
                {
                    fun(htResult);//刷新列表显示
                }

                ////刷新当前图像
                //g_BaseDealComprehensive.RefreshCurrImage();

                //foreach (CellReference cellReference in baseParCalibrate.g_ParCellExecuteReferenceForMult.g_CellExecute_L)
                //{
                //    g_BaseDealComprehensive.RefreshHobject(cellReference.NameCell);
                //    g_BaseDealComprehensive.RefreshShape(cellReference.NameCell);
                //    g_BaseDealComprehensive.RefreshResultInfo(cellReference.NameCell);
                //}
            }
            catch (Exception ex)
            {
                Log.L_I.WriteError(NameClass, ex);
            }
        }
        /// <summary>
        /// 自动校准旋转中心,1401表示位置1第一次拍照,
        /// </summary>
        /// <param name="pos">算子序号,不表示拍照位置</param>
        /// <param name="index"></param>
        /// <param name="htResult">哈希表结果</param>
        /// <returns></returns>
        bool CalibRotate(int pos, int index, out Hashtable htResult)
        {
            htResult = null;
            Stopwatch sw = new Stopwatch();

            try
            {
                //获取该算子所有的单元格
                List <string> nameCell_L = g_BaseParComprehensive.GetAllNameCellByType("旋转中心变换");
                if (nameCell_L.Count < pos)
                {
                    WinMsgBox.ShowMsgBox("算子个数小于序号!");
                    return(false);
                }
                string nameCell = nameCell_L[pos - 1];//单元格名称

                ParCalibRotate par = g_BaseParComprehensive.GetCellParCalibrate(nameCell) as ParCalibRotate;

                int indexCell = int.Parse(nameCell.Replace("C", ""));//单元格索引

                ParCellExeReference  parCellExeReference  = par.g_ParCellExecuteReference;
                ParGetResultFromCell parGetResultFromCell = par.g_ParGetResultFromCellForRC;//用来计算旋转中心

                //调用执行
                g_BaseDealComprehensive.DealComprehensivePosCell_ForTestRun(g_UCDisplayCamera, parCellExeReference, par.g_ParCellExecuteReference.g_CellExecute_L, out htResult);//执行算法且显示

                string cellError = "";
                if (!GetErrorCell(htResult, pos, out cellError))
                {
                    WinMsgBox.ShowMsgBox(string.Format("相机{0}位置{1},单元格{2}校准计算错误", g_NoCamera.ToString(), pos.ToString(), par.NameCell));
                    return(false);
                }

                FunCellDataReferenc fun = new FunCellDataReferenc();
                fun.GetResultValue(htResult, parGetResultFromCell, index - 1);

                string info = string.Format("相机{0}位置{1},单元格{2}", g_NoCamera.ToString(), pos.ToString(), par.NameCell);
                if (index == 1)
                {
                    info += "旋转中心校准第一次拍照";
                    ShowState(info);

                    SaveStdImage(par, "旋转中心位置1");
                }
                else if (index == 2)
                {
                    info += "旋转中心校准第二次拍照";
                    ShowState(info);
                    SaveStdImage(par, "旋转中心位置2");

                    FunCalibRotate funCalibRotate = new FunCalibRotate();
                    Point2D        point          = funCalibRotate.GetOriginPoint(par);
                    par.XRC = point.DblValue1;
                    par.YRC = point.DblValue2;

                    //显示求取的旋转中心
                    info = string.Format("旋转中心:X{0},Y{1}", par.XRC.ToString(), par.YRC.ToString());

                    ShowState(info);

                    //保存此单元格
                    bool blSave = g_BaseParComprehensive.WriteXmlDoc(par.NameCell);

                    if (blSave)
                    {
                        ShowState(string.Format("将参数旋转中心校准{0}保存到本地成功", par.NameCell));
                    }
                    else
                    {
                        ShowAlarm(string.Format("将参数旋转中心校准{0}保存到本地失败", par.NameCell));
                        return(false);
                    }

                    //将参数保存到结果中
                    bool blSaveResult = g_BaseDealComprehensive.InitCalibRotate(indexCell);
                    if (blSaveResult)
                    {
                        ShowState(string.Format("将参数旋转中心校准{0}保存到结果成功", par.NameCell));
                    }
                    else
                    {
                        ShowAlarm(string.Format("将参数旋转中心校准{0}保存到结果失败", par.NameCell));
                        return(false);
                    }
                }
                return(true);
            }
            catch (Exception ex)
            {
                ShowAlarm(string.Format("相机{0}旋转中心计算进入Catch", g_NoCamera.ToString()));
                Log.L_I.WriteError(NameClass, ex);
                return(false);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 自动轴,1301表示位置1第一次拍照,轴坐标的计算是双数点进行保存,轴计算是两个数据表示一根轴,20181111-zx
        /// </summary>
        /// <param name="pos">算子的序号,并非拍照位置</param>
        /// <param name="index"></param>
        /// <param name="htResult">哈希表结果</param>
        /// <returns></returns>
        bool CalibAxis(int pos, int index, out Hashtable htResult)
        {
            htResult = null;
            Stopwatch sw = new Stopwatch();

            sw.Restart();
            try
            {
                List <string> nameCell_L = g_BaseParComprehensive.GetAllNameCellByType("轴坐标校准");
                if (nameCell_L.Count < pos)
                {
                    WinMsgBox.ShowMsgBox("算子个数小于序号!");
                    return(false);
                }
                string nameCell = nameCell_L[pos - 1];

                ParCalibAxis par       = g_BaseParComprehensive.GetCellParCalibrate(nameCell) as ParCalibAxis;
                int          indexCell = int.Parse(nameCell.Replace("C", ""));//单元格索引

                ParCellExeReference  parCellExeReference  = par.g_ParCellExecuteReference;
                ParGetResultFromCell parGetResultFromCell = par.g_ParGetResultFromCell;//用来计算轴

                //调用执行
                g_BaseDealComprehensive.DealComprehensivePosCell_ForTestRun(g_UCDisplayCamera, parCellExeReference, par.g_ParCellExecuteReference.g_CellExecute_L, out htResult);//执行算法且显示

                string cellError = "";
                if (!GetErrorCell(htResult, pos, out cellError))
                {
                    WinMsgBox.ShowMsgBox(string.Format("相机{0}位置{1},单元格{2}校准计算错误", g_NoCamera.ToString(), pos.ToString(), par.NameCell));
                    return(false);
                }
                FunCellDataReferenc fun = new FunCellDataReferenc();
                fun.GetResultValue(htResult, parGetResultFromCell, index - 1);

                string info = string.Format("相机{0}位置{1},单元格{2}", g_NoCamera.ToString(), pos.ToString(), par.NameCell);

                //保存基准图片
                SaveStdImage(par, "轴校准" + index.ToString());

                if (index % 2 == 1)
                {
                    info += string.Format("轴校准第{0}次拍照", index);
                    //日志
                    ShowState_Cam(info);
                }
                else
                {
                    info += string.Format("轴校准第{0}次拍照", index);
                    //保存基准图片
                    SaveStdImage(par, "旋转中心位置2");
                    //日志
                    ShowState_Cam(info);

                    FunCalibAxis funCalibCoord = new FunCalibAxis();
                    Point4D      pResult       = funCalibCoord.GetAxisAngleDir(par);
                    par.XAxisAngle_J = pResult.DblValue1;
                    par.YAxisAngle_J = pResult.DblValue2;

                    par.XAxisDir = (int)pResult.DblValue3;
                    par.YAxisDir = (int)pResult.DblValue4;

                    //显示求取的轴角度
                    info = string.Format("轴角度:X轴{0},Y轴{1}", par.XAxisAngle_J.ToString(), par.YAxisAngle_J.ToString());
                    //日志
                    ShowState_Cam(info);

                    //显示求取的轴方向
                    info = string.Format("轴方向:X轴{0},Y轴{1}", par.XAxisDir.ToString(), par.YAxisDir.ToString());
                    //日志
                    ShowState_Cam(info);

                    //保存此单元格
                    bool blSave = g_BaseParComprehensive.WriteXmlDoc(par.NameCell);

                    if (blSave)
                    {
                        //日志
                        ShowState_Cam(string.Format("将参数{0}保存到本地成功", par.NameCell));
                    }
                    else
                    {
                        //日志
                        ShowAlarm_Cam(string.Format("将参数{0}保存到本地失败", par.NameCell));
                        return(false);
                    }

                    //将参数保存到结果中
                    bool blSaveResult = g_BaseDealComprehensive.InitCalibAxis(indexCell);
                    if (blSaveResult)
                    {
                        //日志
                        ShowState_Cam(string.Format("将参数{0}保存到结果成功", par.NameCell));
                    }
                    else
                    {
                        //日志
                        ShowAlarm_Cam(string.Format("将参数{0}保存到结果失败", par.NameCell));
                        return(false);
                    }
                }
                return(true);
            }
            catch (Exception ex)
            {
                //日志
                ShowAlarm_Cam("轴校准计算进入Catch");
                Log.L_I.WriteError(NameClass, ex);
                return(false);
            }
        }
        /// <summary>
        /// 自动相机校准,1201表示位置1第一次拍照,
        /// </summary>
        /// <param name="pos"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        bool CalibCamera(int pos, int index, out Hashtable htResult)
        {
            htResult = null;
            Stopwatch sw = new Stopwatch();

            sw.Restart();
            try
            {
                ParCalibCamera par       = g_BaseParComprehensive.GetCellParCalibByType("相机校准", pos) as ParCalibCamera;
                string         nameCell  = par.NameCell;                         //单元格名称
                int            indexCell = int.Parse(nameCell.Replace("C", "")); //单元格索引

                //关联算法,用来获取角点
                ParCellExeReference  parCellExeReference  = par.g_ParCellExecuteReference;
                ParGetResultFromCell parGetResultFromCell = par.g_ParGetResultFromCell;

                //调用执行
                g_BaseDealComprehensive.DealComprehensivePosCell_ForTestRun(g_UCDisplayCamera, parCellExeReference, par.g_ParCellExecuteReference.g_CellExecute_L, out htResult);//执行算法但不显示

                string cellError = "";
                if (!GetErrorCell(htResult, pos, out cellError))
                {
                    WinMsgBox.ShowMsgBox(string.Format("相机{0}位置{1},单元格{2}校准计算错误", g_NoCamera.ToString(), pos.ToString(), par.NameCell));
                    return(false);
                }
                FunCellDataReferenc fun = new FunCellDataReferenc();
                fun.GetResultValue(htResult, parGetResultFromCell, index - 1);

                string info = string.Format("相机{0}位置{1},单元格{2}相机校准触发拍照", g_NoCamera.ToString(), pos.ToString(), par.NameCell);
                ShowState(info);

                FunCalibCamera    funCalibCamera = new FunCalibCamera();
                ResultCalibCamera result         = funCalibCamera.DealCalibCamera(par);

                info = "将标定参数保存到结果";
                ShowState(info);

                //参数保存到Par
                bool blSavePar = funCalibCamera.SaveResultToPar(par, result);
                //将参数保存到结果中
                bool blSaveResult = funCalibCamera.SaveResultToStdResult(par, htResult);


                if (blSaveResult)
                {
                    ShowState(string.Format("将相机{0}参数{1}保存到结果成功", g_NoCamera.ToString(), par.NameCell));
                }
                else
                {
                    ShowAlarm(string.Format("将相机{0}参数{1}保存到结果失败", g_NoCamera.ToString(), par.NameCell));
                    return(false);
                }

                //保存基准图片
                SaveStdImage(par, "相机校准");
                //保存此单元格
                bool blSave = g_BaseParComprehensive.WriteXmlDoc(par.NameCell);

                if (blSave)
                {
                    ShowState(string.Format("将相机{0}参数{1}保存到本地成功", g_NoCamera.ToString(), par.NameCell));
                }
                else
                {
                    ShowAlarm(string.Format("将相机{0}参数{1}保存到本地失败", g_NoCamera.ToString(), par.NameCell));
                    return(false);
                }
                return(true);
            }
            catch (Exception ex)
            {
                WinMsgBox.ShowMsgBox(string.Format("相机{0}校准计算进入Catch", g_NoCamera.ToString()));
                ShowAlarm("相机校准计算进入Catch");
                Log.L_I.WriteError(NameClass, ex);
                return(false);
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 多目校准,获取坐标
        /// </summary>
        /// <param name="pos">算子的序号,并非拍照位置</param>
        /// <param name="index">拍照次序</param>
        /// <param name="htResult">哈希表结果</param>
        /// <returns></returns>
        bool CalibMult_GetPoint(int pos, int index, out Hashtable htResult)
        {
            htResult = null;
            Stopwatch sw = new Stopwatch();

            sw.Restart();
            try
            {
                List <string> nameCell_L = g_BaseParComprehensive.GetAllNameCellByType("多目校准");
                if (nameCell_L.Count < pos)
                {
                    WinMsgBox.ShowMsgBox("算子个数小于序号!");
                    return(false);
                }
                string       nameCell = nameCell_L[pos - 1];
                ParCalibMult par      = g_BaseParComprehensive.GetCellParCalibrate(nameCell) as ParCalibMult;

                int indexCell = int.Parse(nameCell.Replace("C", ""));//单元格索引

                //关联算法,用来获取角点
                ParCellExeReference  parCellExeReference  = par.g_ParCellExecuteReference;
                ParGetResultFromCell parGetResultFromCell = par.g_ParGetResultFromCell;

                //第一次获取坐标的时候,清空历史记录,不能Clear,只能赋值0
                if (index == 1)
                {
                    for (int i = 0; i < parGetResultFromCell.ResultforCalib_L.Count; i++)
                    {
                        parGetResultFromCell.ResultforCalib_L[i].XResult = 0;
                        parGetResultFromCell.ResultforCalib_L[i].YResult = 0;
                    }
                }

                //调用执行
                g_UCDisplayCamera.GrabImageAndShow();
                g_BaseDealComprehensive.DealComprehensivePosCell_ForTestRun(g_UCDisplayCamera, parCellExeReference, par.g_ParCellExecuteReference.g_CellExecute_L, out htResult);//执行算法且显示

                //比对对应的单元格名称,判断结果是否正确
                string cellError = "";
                if (!GetErrorCell(htResult, par.g_ParCellExecuteReference.NameCellExecute_L, out cellError))
                {
                    WinMsgBox.ShowMsgBox(string.Format("相机{0}位置{1},单元格{2}校准计算错误", g_NoCamera.ToString(), pos.ToString(), par.NameCell));
                    return(false);
                }

                FunCellDataReferenc fun = new FunCellDataReferenc();
                fun.GetResultValue(htResult, parGetResultFromCell, index - 1);

                string info = string.Format("相机{0}位置{1},单元格{2}相机多目校准触发拍照", g_NoCamera.ToString(), pos.ToString(), par.NameCell);
                ShowState(info);

                //保存基准图片
                SaveStdImage(par, "多目校准");

                //保存此单元格
                bool blSave = g_BaseParComprehensive.WriteXmlDoc(par.NameCell);

                if (blSave)
                {
                    ShowState(string.Format("将相机{0}参数{1}保存到本地成功", g_NoCamera.ToString(), par.NameCell));
                }
                else
                {
                    ShowAlarm(string.Format("将相机{0}参数{1}保存到本地失败", g_NoCamera.ToString(), par.NameCell));
                    return(false);
                }
                return(true);
            }
            catch (Exception ex)
            {
                WinMsgBox.ShowMsgBox(string.Format("相机{0}多目校准计算进入Catch", g_NoCamera.ToString()));
                ShowAlarm("相机校准计算进入Catch");
                Log.L_I.WriteError(NameClass, ex);
                return(false);
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 自动相机校准,1201表示位置1第一次拍照,
        /// </summary>
        /// <param name="pos"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        bool CalibHandEye(int pos, int index, out Hashtable htResult)
        {
            htResult = null;
            Stopwatch sw = new Stopwatch();

            sw.Restart();
            try
            {
                string info = "";

                ParCalibHandEye par       = g_BaseParComprehensive.GetCellParCalibByType("手眼校准", pos) as ParCalibHandEye;
                string          nameCell  = par.NameCell;                         //单元格名称
                int             indexCell = int.Parse(nameCell.Replace("C", "")); //单元格索引

                if (index != 9)
                {
                    //关联算法,用来获取角点
                    ParCellExeReference  parCellExeReference  = par.g_ParCellExecuteReference;
                    ParGetResultFromCell parGetResultFromCell = par.g_ParGetResultFromCell;

                    //调用执行
                    g_BaseDealComprehensive.DealComprehensivePosCell_ForTestRun(g_UCDisplayCamera, parCellExeReference, par.g_ParCellExecuteReference.g_CellExecute_L, out htResult);//执行算法且显示

                    string cellError = "";
                    if (!GetErrorCell(htResult, pos, out cellError))
                    {
                        WinMsgBox.ShowMsgBox(string.Format("相机{0}位置{1},单元格{2}手眼校准计算错误", g_NoCamera.ToString(), pos.ToString(), par.NameCell));
                        return(false);
                    }
                    FunCellDataReferenc fun = new FunCellDataReferenc();
                    fun.GetResultValue(htResult, parGetResultFromCell, index - 1);

                    info = string.Format("相机{0}位置{1},单元格{2}手眼校准触发拍照", g_NoCamera.ToString(), pos.ToString(), par.NameCell);
                    ShowState(info);

                    //标定开始,清空值
                    if (index == 0)
                    {
                        par.XDelta = 0;
                        par.YDelta = 0;
                        parGetResultFromCell.ClearResult();
                    }
                }

                //保存基准图片
                SaveStdImage(par, "手眼校准" + index.ToString());

                //表示标定结束
                if (index == 99)
                {
                    FunCalibHandEye    funCalibHandEye = new FunCalibHandEye();
                    ResultCalibHandEye result          = funCalibHandEye.CalCalibHandEye(par);

                    //自校准
                    funCalibHandEye.CheckSelf(par, -1);

                    List <double> XDelta_L = new List <double>();
                    List <double> YDelta_L = new List <double>();
                    //自动计算偏差
                    funCalibHandEye.CalDeltaforCalib(par, out XDelta_L, out YDelta_L);
                    string xInfo = "";
                    string yInfo = "";
                    for (int i = 0; i < XDelta_L.Count; i++)
                    {
                        xInfo += XDelta_L[i].ToString() + ",";
                        yInfo += YDelta_L[i].ToString() + ",";
                    }

                    ShowState(string.Format("自校准的偏差为X{0}", xInfo));
                    ShowState(string.Format("自校准的偏差为Y{0}", yInfo));

                    info = "将标定参数保存到结果";
                    ShowState(info);

                    //参数保存到Par
                    bool blSavePar = funCalibHandEye.SaveResultToPar(par, result);
                    //将参数保存到结果中
                    bool blSaveResult = funCalibHandEye.SaveResultToStdResult(par, htResult);

                    if (blSaveResult)
                    {
                        ShowState(string.Format("将相机{0}手眼校准参数{1}保存到结果成功", g_NoCamera.ToString(), par.NameCell));
                    }
                    else
                    {
                        ShowAlarm(string.Format("将相机{0}手眼校准参数{1}保存到结果失败", g_NoCamera.ToString(), par.NameCell));
                        return(false);
                    }

                    //保存此单元格
                    bool blSave = g_BaseParComprehensive.WriteXmlDoc(par.NameCell);

                    if (blSave)
                    {
                        ShowState(string.Format("将相机{0}手眼校准参数{1}保存到本地成功", g_NoCamera.ToString(), par.NameCell));
                    }
                    else
                    {
                        ShowAlarm(string.Format("将相机{0}手眼校准参数{1}保存到本地失败", g_NoCamera.ToString(), par.NameCell));
                        return(false);
                    }
                }

                return(true);
            }
            catch (Exception ex)
            {
                WinMsgBox.ShowMsgBox(string.Format("手眼{0}校准计算进入Catch", g_NoCamera.ToString()));
                ShowAlarm("手眼校准计算进入Catch");
                Log.L_I.WriteError(NameClass, ex);
                return(false);
            }
        }