/// <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> /// 多相机执行 /// </summary> /// <param name="par"></param> /// <param name="baseParCalibrate"></param> /// <param name="fun"></param> public void MainWindow_GetResultValueMult_event(ParGetResultFromCell par, BaseParCalibrate baseParCalibrate, HashAction fun) { try { BaseDealComprehensiveResult baseDealComprehensiveResult = null; int noCamera = par.NoCameraMult;//多相机序号 switch (noCamera) { case 1: baseDealComprehensiveResult = DealComprehensiveResult1; break; case 2: baseDealComprehensiveResult = DealComprehensiveResult2; break; case 3: baseDealComprehensiveResult = DealComprehensiveResult3; break; case 4: baseDealComprehensiveResult = DealComprehensiveResult4; break; case 5: baseDealComprehensiveResult = DealComprehensiveResult5; break; case 6: baseDealComprehensiveResult = DealComprehensiveResult6; break; case 7: baseDealComprehensiveResult = DealComprehensiveResult7; break; case 8: baseDealComprehensiveResult = DealComprehensiveResult8; break; } baseDealComprehensiveResult.GetCellResultValue(par, baseParCalibrate, fun); } 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); } }
/// <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); } }
/// <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); } }
/// <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); } }