#pragma once #include "CCalib.h" #include "dt.h" #include "TypeDef.h" /* XY标定,即相机标定。 包括标定动作和标定结果 */ //using namespace JVision; struct CALIB_XY_PARAM { double dZSafePos = 0; 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, std::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.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; } //获取拍照后的九点像素坐标 std::vector GetNinePixel() { return m_pixels; } //获取九点物理坐标 std::vector GetNinePosition() { return m_positions; } LONG MoveToCalibPos(); LONG CalibTest(int tempId = -1); private: /** * @brief 计算九个标定位置的坐标 */ void calNinePoints(); void DataChangNotice(string strDbName, string strTableName); // 定义一个函数来执行二维仿射变换 //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 m_vecConfigStruct; // 存储XY标定的参数 //CALIB_XY m_stCalibXYParam; CALIB_XY_PARAM m_stCalibParam; // 存储9个标定位置的物理坐标 std::vector m_positions; //存储九个相对位置,即步长 std::vector m_relativePositions; // 存储9个标定位置对应的像素坐标 std::vector m_pixels; // 存储9个标定位置对应的相对像素坐标 std::vector m_relativePixels; };