GrabBag/Tools/VrEyeView/Inc/VrEyeViewWidget.h
2026-02-18 15:11:41 +08:00

184 lines
4.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef VREYEVIEWWIDGET_H
#define VREYEVIEWWIDGET_H
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QSpinBox>
#include <QDoubleSpinBox>
#include <QCheckBox>
#include <QTimer>
#include <QImage>
#include <QLineEdit>
#include <mutex>
#include <memory>
#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(const ChessboardDetectionData&)>;
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<Point2D>& 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<unsigned char> m_imageBuffer;
int m_imageWidth;
int m_imageHeight;
bool m_hasNewImage;
// 检测结果
ChessboardDetectionData m_lastDetection;
std::vector<Point2D> m_lastLeftCorners;
std::vector<Point2D> m_lastRightCorners;
// 回调函数
DetectionCallback m_detectionCallback;
};
#endif // VREYEVIEWWIDGET_H