CXYCalib.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #pragma once
  2. #include "CCalib.h"
  3. #include "dt.h"
  4. #include "TypeDef.h"
  5. /*
  6. XY标定,即相机标定。
  7. 包括标定动作和标定结果
  8. */
  9. //using namespace JVision;
  10. struct CALIB_XY_PARAM {
  11. double dCenterPosX = 0; //九点中间点的X坐标
  12. double dCenterPosY = 0; //九点中间点的Y坐标
  13. double dGrabPosZ = 0; //标定时Z轴位置
  14. double dCalibStepX = 0; //相机标定步进X
  15. double dCalibStepY = 0; //相机标定步进Y
  16. int nTempId = 0; //策略id
  17. string sResultMatrix = ""; //标定结果矩阵
  18. };
  19. class __declspec(dllexport) CXYCalib :
  20. public CCalib
  21. {
  22. // 定义XY标定的类型,分为手眼在手上(EyeOnHand)和手眼在手外(EyeOutHand)两种类型
  23. enum XYCalibType { EyeOnHand, EyeOutHand };
  24. public:
  25. /**
  26. * @brief 构造函数,用于创建CXYCalib对象
  27. *
  28. * @param id 标定的唯一标识符
  29. * @param name 标定的名称
  30. */
  31. CXYCalib(int id, std::string name);
  32. /**
  33. * @brief 析构函数,用于销毁CXYCalib对象
  34. */
  35. ~CXYCalib() {}
  36. /**
  37. * @brief 开始进行XY标定操作
  38. *
  39. * @return int 标定操作的结果,通常0表示成功,非0表示失败
  40. */
  41. virtual int StartCalib() override;
  42. /**
  43. * @brief 设置标定所需的参数
  44. */
  45. virtual void SetParam() override;
  46. /**
  47. * @brief 从数据库管理器获取标定所需的参数
  48. */
  49. virtual LONG GetParam() override;
  50. /**
  51. * @brief 设置PR(Pattern Recognition)的ID
  52. *
  53. * @param id PR的唯一标识符
  54. */
  55. void SetPRID(int id) {
  56. m_stCalibParam_XY.nTempId = id;
  57. SetParam();
  58. }
  59. /**
  60. * @brief 将像素坐标转换为物理坐标
  61. *
  62. * @param pixel 输入的像素坐标
  63. * @param pos 输出的物理坐标
  64. * @return LONG 转换操作的结果,通常OK表示成功,FAIL表示失败
  65. */
  66. LONG PixelToPos(XY_DOUBLE_STRUCT pixel, XY_DOUBLE_STRUCT& pos);
  67. /**
  68. * @brief 将物理坐标转换为像素坐标
  69. *
  70. * @param pos 输入的物理坐标
  71. * @param pixel 输出的像素坐标
  72. * @return LONG 转换操作的结果,通常OK表示成功,FAIL表示失败
  73. */
  74. LONG PosToPixel(XY_DOUBLE_STRUCT pos, XY_DOUBLE_STRUCT& pixel);
  75. //获取标定数据
  76. //CALIB_XY GetCalibParam() { return m_stCalibXYParam; }
  77. //获取拍照后的九点像素坐标
  78. std::vector<JVision::Point2D> GetNinePixel() { return m_pixels; }
  79. //获取九点物理坐标
  80. std::vector<JVision::Point2D> GetNinePosition() { return m_positions; }
  81. LONG MoveToCalibPos();
  82. LONG CalibTest(int tempId = -1);
  83. private:
  84. /**
  85. * @brief 计算九个标定位置的坐标
  86. */
  87. void calNinePoints();
  88. void DataChangNotice(string strDbName, string strTableName);
  89. // 定义一个函数来执行二维仿射变换
  90. //XY_DOUBLE_STRUCT affineTransform(XY_DOUBLE_STRUCT p) {
  91. // CManageDB::GetInstance()->GetCMachineCalibration()->GetCalibXYParam(m_nID, m_sName, m_stCalibXYParam);
  92. // XY_DOUBLE_STRUCT transformedPoint;
  93. // transformedPoint.x = m_stCalibXYParam.m_dA * p.x + m_stCalibXYParam.m_dB * p.y + m_stCalibXYParam.m_dTx;
  94. // transformedPoint.y = m_stCalibXYParam.m_dC * p.x + m_stCalibXYParam.m_dD * p.y + m_stCalibXYParam.m_dTy;
  95. // return transformedPoint;
  96. //}
  97. private:
  98. // 定义标定位置的数量为9个
  99. const static int PosNum = 9;
  100. vector<MODULE_CONFIG_STRUCT> m_vecConfigStruct;
  101. // 存储XY标定的参数
  102. //CALIB_XY m_stCalibXYParam;
  103. CALIB_XY_PARAM m_stCalibParam_XY;
  104. // 存储9个标定位置的物理坐标
  105. std::vector<JVision::Point2D> m_positions;
  106. //存储九个相对位置,即步长
  107. std::vector<JVision::Point2D> m_relativePositions;
  108. // 存储9个标定位置对应的像素坐标
  109. std::vector<JVision::Point2D> m_pixels;
  110. // 存储9个标定位置对应的相对像素坐标
  111. std::vector<JVision::Point2D> m_relativePixels;
  112. };