GrabBag/Tools/VrEyeView/Inc/VrEyeViewWidget.h

201 lines
4.7 KiB
C
Raw Normal View History

2026-02-18 15:11:41 +08:00
#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();
/**
2026-02-21 00:28:04 +08:00
* @brief
2026-02-18 15:11:41 +08:00
*/
2026-02-21 00:28:04 +08:00
void onLoadLeftImage();
/**
* @brief
*/
void onLoadRightImage();
2026-02-18 15:11:41 +08:00
/**
* @brief
*/
void onUpdateDisplay();
private:
/**
* @brief
*/
void setupUI();
/**
2026-02-21 00:28:04 +08:00
* @brief SDK线程调用
2026-02-18 15:11:41 +08:00
*/
2026-02-21 00:28:04 +08:00
static void OnImageCallback(SVzNLImageData* pLeftImage,
SVzNLImageData* pRightImage,
SVzNLImageData* pCenterImage,
const SVzOutputFrameProps* pFrameProps,
void* pUserData);
2026-02-18 15:11:41 +08:00
/**
2026-02-21 00:28:04 +08:00
* @brief SDK线程调用线
2026-02-18 15:11:41 +08:00
*/
2026-02-21 00:28:04 +08:00
void ProcessImageData(SVzNLImageData* pLeftImage, SVzNLImageData* pRightImage);
/**
* @brief
*/
void resizeEvent(QResizeEvent* event) override;
2026-02-18 15:11:41 +08:00
/**
* @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;
2026-02-21 00:28:04 +08:00
// 相机内参控件3x3矩阵形式
// | fx 0 cx |
// | 0 fy cy |
// | 0 0 1 |
QDoubleSpinBox* m_sbFx; // [0,0]
QDoubleSpinBox* m_sbFy; // [1,1]
QDoubleSpinBox* m_sbCx; // [0,2]
QDoubleSpinBox* m_sbCy; // [1,2]
2026-02-18 15:11:41 +08:00
// 检测选项
QCheckBox* m_cbAdaptiveThresh;
QCheckBox* m_cbNormalizeImage;
QCheckBox* m_cbAutoDetect;
// 状态标签
QLabel* m_lblStatus;
QLabel* m_lblDetectionResult;
// 定时器
QTimer* m_displayTimer;
// 状态
bool m_isConnected;
bool m_isCapturing;
2026-02-21 00:28:04 +08:00
// 左右目图像(加载或采集)
2026-02-18 15:11:41 +08:00
QImage m_leftImage;
QImage m_rightImage;
2026-02-21 00:28:04 +08:00
// 实时采集图像缓存SDK回调线程写主线程读
std::mutex m_captureMutex;
QImage m_captureLeft;
QImage m_captureRight;
2026-02-18 15:11:41 +08:00
bool m_hasNewImage;
// 检测结果
ChessboardDetectionData m_lastDetection;
std::vector<Point2D> m_lastLeftCorners;
std::vector<Point2D> m_lastRightCorners;
// 回调函数
DetectionCallback m_detectionCallback;
};
#endif // VREYEVIEWWIDGET_H