GrabBag/App/BinocularMark/BinocularMarkApp/BinocularMarkPresenter.h

354 lines
11 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"
#include "IYTCPServer.h"
2025-12-10 00:01:32 +08:00
/**
* @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; }
public slots:
/**
* @brief +Mark
*/
void handleSingleDetection(const TCPClient* pClient);
/**
* @brief
*/
void handleSingleImage(const TCPClient* pClient);
/**
* @brief
*/
void handleStartWork();
/**
* @brief
*/
void handleStopWork();
/**
2025-12-20 16:18:12 +08:00
* @brief
*/
void handleStartContinuousImage();
/**
* @brief
*/
void handleStopContinuousImage();
/**
* @brief
* @param exposureTime
*/
void handleSetExposureTime(double exposureTime);
/**
2025-12-20 16:18:12 +08:00
* @brief
* @param gain
*/
void handleSetGain(double gain);
2025-12-20 16:18:12 +08:00
/**
* @brief
* @param exposureTime
*/
void handleSetLeftExposureTime(double exposureTime);
/**
* @brief
* @param exposureTime
*/
void handleSetRightExposureTime(double exposureTime);
/**
* @brief
* @param gain
*/
void handleSetLeftGain(double gain);
/**
* @brief
* @param gain
*/
void handleSetRightGain(double gain);
/**
* @brief
* @param pClient
* @param camera ("left""right")
*/
void handleGetCameraInfo(const TCPClient* pClient, const QString& camera);
/**
* @brief
* @param pClient
*/
void handleGetCalibration(const TCPClient* pClient);
/**
* @brief
* @param pClient
* @param calibrationXml XML内容
*/
void handleSetCalibration(const TCPClient* pClient, const QString& calibrationXml);
2025-12-10 00:01:32 +08:00
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
*/
void singleDetectionResult(const TCPClient* pClient,
std::vector<SWD_charuco3DMark> marks,
cv::Mat leftImage,
cv::Mat rightImage,
int errorCode);
/**
* @brief
*/
void singleImageResult(const TCPClient* pClient,
cv::Mat leftImage,
cv::Mat rightImage);
2025-12-20 16:18:12 +08:00
/**
* @brief
* @param pClient
* @param camera ("left""right")
* @param serialNumber
* @param modelName
* @param displayName
* @param exposureTime
* @param gain
*/
void cameraInfoResult(const TCPClient* pClient,
const QString& camera,
const QString& serialNumber,
const QString& modelName,
const QString& displayName,
double exposureTime,
double gain);
/**
* @brief
* @param pClient
* @param calibrationXml XML字符串
*/
void calibrationMatrixResult(const TCPClient* pClient, const QString& calibrationXml);
2025-12-10 00:01:32 +08:00
/**
* @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::atomic<bool> m_bSendContinuousResult; // 是否发送持续检测结果
2025-12-20 16:18:12 +08:00
std::atomic<bool> m_bSendContinuousImage; // 是否发送持续图像流
std::atomic<bool> m_bIsProcessingImage; // 是否正在处理图像(用于丢帧)
std::chrono::steady_clock::time_point m_lastImageSendTime; // 上次发送图像时间(用于限制帧率)
2025-12-10 00:01:32 +08:00
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; // 右相机索引
2025-12-20 16:18:12 +08:00
std::string m_strLeftCameraSerial; // 左相机序列号(优先使用)
std::string m_strRightCameraSerial; // 右相机序列号(优先使用)
2025-12-10 00:01:32 +08:00
// 相机参数
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; // 视差偏移
2025-12-20 16:18:12 +08:00
// 标定文件路径
QString m_calibrationFilePath; // 标定文件完整路径
2025-12-10 00:01:32 +08:00
};
#endif // BINOCULARMARKPRESENTER_H