GrabBag/App/BinocularMark/BinocularMarkApp/BinocularMarkPresenter.h

216 lines
7.0 KiB
C
Raw Normal View History

2025-12-10 00:01:32 +08:00
#ifndef BINOCULARMARKPRESENTER_H
#define BINOCULARMARKPRESENTER_H
#include <QObject>
#include <QMutex>
#include <QTimer>
#include <QString>
#include <QImage>
#include <atomic>
#include <thread>
#include <memory>
#include <opencv2/opencv.hpp>
#include "IGalaxyDevice.h"
#include "binocularMarkCam_Export.h"
#include "SG_baseDataType.h"
/**
* @brief BinocularMark检测系统Presenter类
*
*/
class BinocularMarkPresenter : public QObject
{
Q_OBJECT
public:
explicit BinocularMarkPresenter(QObject *parent = nullptr);
~BinocularMarkPresenter();
/**
* @brief
* @return 0-0-
*/
int initCameras();
/**
* @brief
*/
void closeCameras();
/**
* @brief 线
* @return 0-0-
*/
int startDetection();
/**
* @brief
*/
void stopDetection();
/**
* @brief
*/
bool isDetecting() const { return m_bIsDetecting.load(); }
/**
* @brief XML格式
*
* config.xml加载应用配置Mark参数等
* StereoCamera.xml
*
* XML格式参考WorkpieceProjectConfig/config/config.xml
*
* config.xml中配置标定文件路径
* <CalibrationFile path="../Calib/Mark_13度/StereoCamera.xml" />
*
* @param configFilePath
* @return true-false-
*/
bool loadConfiguration(const QString& configFilePath);
/**
* @brief OpenCV XML格式
*
* StereoCamera.xml文件读取所有标定参数
* -
* - R1, R2, P1, P2, Q
*
*
*
* @param calibFilePath StereoCamera.xml
* @return true-false-
*/
bool loadCalibration(const QString& calibFilePath);
/**
* @brief
*/
quint16 getServerPort() const { return m_nServerPort; }
/**
* @brief
*/
void setServerPort(quint16 port) { m_nServerPort = port; }
/**
* @brief Q矩阵数据
*/
const cv::Mat& getQMatrix() const { return m_Q; }
/**
* @brief Mark配置信息
*/
void setMarkInfo(const SWD_BQ_CharucoMarkInfo& markInfo) { m_markInfo = markInfo; }
/**
* @brief Board配置信息
*/
void setBoardInfo(const SWD_BQ_MarkBoardInfo& boardInfo) { m_boardInfo = boardInfo; }
signals:
/**
* @brief
* @param marks 3D标记列表
* @param leftImage
* @param rightImage
* @param errorCode
*/
void detectionResult(std::vector<SWD_charuco3DMark> marks,
cv::Mat leftImage,
cv::Mat rightImage,
int errorCode);
/**
* @brief
* @param connected true-false-
*/
void cameraConnectionChanged(bool connected);
private slots:
/**
* @brief
*/
void onCameraReconnectTimer();
private:
/**
* @brief 线
*/
void captureThreadFunc();
/**
* @brief
* @return 0-0-
*/
int tryConnectCameras();
/**
* @brief
*/
void leftCameraCallback(const GalaxyImageData& imageData);
/**
* @brief
*/
void rightCameraCallback(const GalaxyImageData& imageData);
/**
* @brief
*/
void processImages();
/**
* @brief GalaxyImageData转换为cv::Mat
*/
cv::Mat imageDataToMat(const GalaxyImageData& imageData);
private:
// 双目相机设备对象
IGalaxyDevice* m_pLeftCamera; // 左相机
IGalaxyDevice* m_pRightCamera; // 右相机
// 相机重连机制
QTimer* m_pCameraReconnectTimer; // 相机重连定时器
std::atomic<bool> m_bCameraConnected; // 相机是否已连接
std::atomic<bool> m_bAutoStartDetection; // 重连成功后是否自动启动检测
// 采集控制
std::atomic<bool> m_bIsDetecting; // 是否正在检测
std::thread m_captureThread; // 采集线程
// 图像缓存
QMutex m_imageMutex; // 图像互斥锁
GalaxyImageData m_leftImageData; // 左相机图像数据
GalaxyImageData m_rightImageData; // 右相机图像数据
bool m_bLeftImageReady; // 左相机图像就绪标志
bool m_bRightImageReady; // 右相机图像就绪标志
// 配置参数
quint16 m_nServerPort; // TCP服务器端口
unsigned int m_nLeftCameraIndex; // 左相机索引
unsigned int m_nRightCameraIndex; // 右相机索引
// 相机参数
double m_fExposureTime; // 曝光时间
double m_fGain; // 增益
// 双目标定参数OpenCV标定得到的完整参数
cv::Mat m_cameraMatrixL; // 左相机内参矩阵 3x3
cv::Mat m_distCoeffsL; // 左相机畸变系数
cv::Mat m_cameraMatrixR; // 右相机内参矩阵 3x3
cv::Mat m_distCoeffsR; // 右相机畸变系数
cv::Mat m_R1; // 左相机校正旋转矩阵 3x3
cv::Mat m_R2; // 右相机校正旋转矩阵 3x3
cv::Mat m_P1; // 左相机投影矩阵 3x4
cv::Mat m_P2; // 右相机投影矩阵 3x4
cv::Mat m_Q; // 视差到深度的映射矩阵 4x4
// Mark检测配置参数
SWD_BQ_CharucoMarkInfo m_markInfo; // Mark板配置
SWD_BQ_MarkBoardInfo m_boardInfo; // Board配置
double m_disparityOffset; // 视差偏移
};
#endif // BINOCULARMARKPRESENTER_H