CXYCalib.h 3.5 KB

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