#ifndef VREYEVIEWWIDGET_H #define VREYEVIEWWIDGET_H #include #include #include #include #include #include #include #include #include #include #include #include "IVrEyeDevice.h" #include "IChessboardDetector.h" #include "VZNL_Common.h" /** * @brief 标定板检测回调数据 */ struct ChessboardDetectionData { bool detected; // 是否检测到 double x, y, z; // 标定板中心位置(相机坐标系,单位:mm) double nx, ny, nz; // 标定板法向量(单位向量) double rx, ry, rz; // 标定板姿态(欧拉角,度) }; /** * @brief VrEyeView 主窗口部件 * 用于显示相机图像并进行标定板检测 */ class VrEyeViewWidget : public QWidget { Q_OBJECT public: explicit VrEyeViewWidget(QWidget* parent = nullptr); ~VrEyeViewWidget() override; /** * @brief 设置检测回调函数 */ using DetectionCallback = std::function; void SetDetectionCallback(DetectionCallback callback); signals: /** * @brief 检测到标定板信号 */ void chessboardDetected(const ChessboardDetectionData& data); private slots: /** * @brief 连接相机 */ void onConnectCamera(); /** * @brief 断开相机 */ void onDisconnectCamera(); /** * @brief 开始采集 */ void onStartCapture(); /** * @brief 停止采集 */ void onStopCapture(); /** * @brief 检测标定板 */ void onDetectChessboard(); /** * @brief 加载图片 */ void onLoadImage(); /** * @brief 更新显示 */ void onUpdateDisplay(); private: /** * @brief 初始化界面 */ void setupUI(); /** * @brief 相机数据回调 */ static void OnLaserDataCallback(EVzResultDataType eDataType, SVzLaserLineData* pLaserData, void* pUserData); /** * @brief 处理激光数据 */ void ProcessLaserData(EVzResultDataType eDataType, SVzLaserLineData* pLaserData); /** * @brief 更新左右目图像显示(保持比例,不拉伸) */ void UpdateImageDisplay(); /** * @brief 在图像上绘制角点 */ void DrawCorners(QImage& image, const std::vector& corners); // 相机设备 IVrEyeDevice* m_eyeDevice; // 标定板检测器 IChessboardDetector* m_detector; // UI 控件 - 左右目图像 QLabel* m_leftImageLabel; QLabel* m_rightImageLabel; QPushButton* m_btnConnect; QPushButton* m_btnDisconnect; QPushButton* m_btnStartCapture; QPushButton* m_btnStopCapture; QPushButton* m_btnDetect; // 相机参数控件 QLineEdit* m_editCameraIP; QSpinBox* m_sbExposure; QSpinBox* m_sbGain; // 标定板参数控件 QSpinBox* m_sbPatternWidth; QSpinBox* m_sbPatternHeight; QDoubleSpinBox* m_sbSquareSize; // 相机内参控件 QDoubleSpinBox* m_sbFx; QDoubleSpinBox* m_sbFy; QDoubleSpinBox* m_sbCx; QDoubleSpinBox* m_sbCy; // 检测选项 QCheckBox* m_cbAdaptiveThresh; QCheckBox* m_cbNormalizeImage; QCheckBox* m_cbAutoDetect; // 状态标签 QLabel* m_lblStatus; QLabel* m_lblDetectionResult; // 定时器 QTimer* m_displayTimer; // 状态 bool m_isConnected; bool m_isCapturing; // 左右目图像 QImage m_leftImage; QImage m_rightImage; std::vector m_imageBuffer; int m_imageWidth; int m_imageHeight; bool m_hasNewImage; // 检测结果 ChessboardDetectionData m_lastDetection; std::vector m_lastLeftCorners; std::vector m_lastRightCorners; // 回调函数 DetectionCallback m_detectionCallback; }; #endif // VREYEVIEWWIDGET_H