123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #pragma once
- #include "CCalib.h"
- #include "dt.h"
- #include "TypeDef.h"
- /*
- XY标定,即相机标定。
- 包括标定动作和标定结果
- */
- //using namespace JVision;
- using namespace std;
- struct CALIB_XY_PARAM {
- double dCenterPosX = 0; //九点中间点的X坐标
- double dCenterPosY = 0; //九点中间点的Y坐标
- double dGrabPosZ = 0; //标定时Z轴位置
- double dCalibStepX = 0; //相机标定步进X
- double dCalibStepY = 0; //相机标定步进Y
- int nTempId = 0; //策略id
- string sResultMatrix = ""; //标定结果矩阵
- };
- class __declspec(dllexport) CXYCalib :
- public CCalib
- {
- // 定义XY标定的类型,分为手眼在手上(EyeOnHand)和手眼在手外(EyeOutHand)两种类型
- enum XYCalibType { EyeOnHand, EyeOutHand };
- public:
- /**
- * @brief 构造函数,用于创建CXYCalib对象
- *
- * @param id 标定的唯一标识符
- * @param name 标定的名称
- */
- CXYCalib(int id, string name);
- /**
- * @brief 析构函数,用于销毁CXYCalib对象
- */
- ~CXYCalib() {}
- /**
- * @brief 开始进行XY标定操作
- *
- * @return int 标定操作的结果,通常0表示成功,非0表示失败
- */
- virtual int StartCalib() override;
- /**
- * @brief 设置标定所需的参数
- */
- virtual void SetParam() override;
- /**
- * @brief 从数据库管理器获取标定所需的参数
- */
- virtual LONG GetParam() override;
- /**
- * @brief 设置PR(Pattern Recognition)的ID
- *
- * @param id PR的唯一标识符
- */
- void SetPRID(int id) {
- m_stCalibParam_XY.nTempId = id;
- SetParam();
- }
- /**
- * @brief 将像素坐标转换为物理坐标
- *
- * @param pixel 输入的像素坐标
- * @param pos 输出的物理坐标
- * @return LONG 转换操作的结果,通常OK表示成功,FAIL表示失败
- */
- LONG PixelToPos(XY_DOUBLE_STRUCT pixel, XY_DOUBLE_STRUCT& pos);
- /**
- * @brief 将物理坐标转换为像素坐标
- *
- * @param pos 输入的物理坐标
- * @param pixel 输出的像素坐标
- * @return LONG 转换操作的结果,通常OK表示成功,FAIL表示失败
- */
- LONG PosToPixel(XY_DOUBLE_STRUCT pos, XY_DOUBLE_STRUCT& pixel);
- //获取标定数据
- //CALIB_XY GetCalibParam() { return m_stCalibXYParam; }
- //获取拍照后的九点像素坐标
- vector<JVision::Point2D> GetNinePixel() { return m_pixels; }
- //获取九点物理坐标
- vector<JVision::Point2D> GetNinePosition() { return m_positions; }
- LONG MoveToCalibPos();
- private:
- /**
- * @brief 计算九个标定位置的坐标
- */
- void calNinePoints();
- // 定义一个函数来执行二维仿射变换
- //XY_DOUBLE_STRUCT affineTransform(XY_DOUBLE_STRUCT p) {
- // CManageDB::GetInstance()->GetCMachineCalibration()->GetCalibXYParam(m_nID, m_sName, m_stCalibXYParam);
- // XY_DOUBLE_STRUCT transformedPoint;
- // transformedPoint.x = m_stCalibXYParam.m_dA * p.x + m_stCalibXYParam.m_dB * p.y + m_stCalibXYParam.m_dTx;
- // transformedPoint.y = m_stCalibXYParam.m_dC * p.x + m_stCalibXYParam.m_dD * p.y + m_stCalibXYParam.m_dTy;
- // return transformedPoint;
- //}
- private:
- // 定义标定位置的数量为9个
- const static int PosNum = 9;
- vector<MODULE_CONFIG_STRUCT> m_vecConfigStruct;
- // 存储XY标定的参数
- //CALIB_XY m_stCalibXYParam;
- CALIB_XY_PARAM m_stCalibParam_XY;
- // 存储9个标定位置的物理坐标
- vector<JVision::Point2D> m_positions;
- //存储九个相对位置,即步长
- vector<JVision::Point2D> m_relativePositions;
- // 存储9个标定位置对应的像素坐标
- vector<JVision::Point2D> m_pixels;
- // 存储9个标定位置对应的相对像素坐标
- vector<JVision::Point2D> m_relativePixels;
- };
|