248 lines
8.3 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 WORKPIECEPRESENTER_H
#define WORKPIECEPRESENTER_H
#include <condition_variable>
#include <thread>
#include <map>
#include <mutex>
#include <memory>
#include "BasePresenter.h"
#include "IVrConfig.h"
#include "IVrEyeDevice.h"
#include "ConfigManager.h"
#include "TCPServerProtocol.h"
#include "IYWorkpieceStatus.h"
#include "SG_baseDataType.h"
#include "VrConvert.h"
#include "LaserDataLoader.h"
#include <QImage>
#include <QPainter>
#include <QColor>
#include <QObject>
#include <QTimer>
#include <memory>
// Forward declarations
class DetectPresenter;
// 2D点结构体替代cv::Point2f
struct Point2D
{
double x = 0.0;
double y = 0.0;
Point2D() = default;
Point2D(double _x, double _y) : x(_x), y(_y) {}
};
// 3D点结构体替代cv::Point3f
struct Point3D
{
double x = 0.0;
double y = 0.0;
double z = 0.0;
Point3D() = default;
Point3D(double _x, double _y, double _z) : x(_x), y(_y), z(_z) {}
};
// 工件检测结果结构
struct WorkpieceDetectionResult
{
int cameraIndex; // 相机索引
double timestamp; // 检测时间戳
bool success; // 检测是否成功
std::vector<Point2D> corners; // 检测到的角点坐标(图像坐标)
std::vector<Point3D> worldCorners; // 世界坐标系中的角点
QImage detectionImage; // 检测结果图像
QImage originalImage; // 原始图像
std::string errorMessage; // 错误信息
double confidence; // 置信度
};
// Note: DetectionResult is defined in IYWorkpieceStatus.h and uses WorkpiecePosition
// 工件角点提取算法参数结构
struct WorkpieceCornerParams
{
double threshold1 = 50.0; // Canny边缘检测阈值1
double threshold2 = 150.0; // Canny边缘检测阈值2
double minLineLength = 50.0; // 最小线段长度
double maxLineGap = 10.0; // 最大线段间隙
double minCornerDistance = 20.0; // 最小角点距离
double areaThreshold = 1000.0; // 面积阈值
bool enablePerspectiveCorrection = true; // 是否启用透视校正
double targetAspectRatio = 1.0; // 目标长宽比
};
// 当前执行参数结构
struct CurrentExecutionParams
{
int cameraIndex = 1; // 相机序号
WorkpieceCornerParams cornerParams; // 角点提取参数
};
class WorkpiecePresenter : public BasePresenter, public IConfigChangeListener, public IVrConfigChangeNotify
{
Q_OBJECT
public:
explicit WorkpiecePresenter(QObject *parent = nullptr);
~WorkpiecePresenter();
// 初始化
int InitApp() override;
// 获取配置对象
IVrConfig* GetConfig() { return m_vrConfig; }
// 获取配置结果对象
ConfigResult* GetConfigResult() { return &m_configResult; }
// 手眼标定矩阵管理
CalibMatrix GetClibMatrix(int index) const;
// 实现IConfigChangeListener接口
virtual void OnSystemConfigChanged(const SystemConfig& config) override;
virtual void OnCameraParamChanged(int cameraIndex, const CameraUIParam& cameraParam) override;
virtual void OnAlgorithmParamChanged(const VrAlgorithmParams& algorithmParams) override;
// 实现IVrConfigChangeNotify接口
virtual void OnConfigChanged(const ConfigResult& configResult) override;
// 配置管理
ConfigManager* GetConfigManager() { return m_pConfigManager.get(); }
// 获取角点提取参数
WorkpieceCornerParams GetWorkpieceCornerParams() const { return m_currentExecutionParams.cornerParams; }
// 设置角点提取参数
void SetWorkpieceCornerParams(const WorkpieceCornerParams& params);
// 发送JSON格式检测结果给客户端
void SendDetectionResultToClient(const WorkpieceDetectionResult& result);
protected:
// ============ 实现 BasePresenter 纯虚函数 ============
/**
* @brief 初始化算法参数(实现纯虚函数)
*/
int InitAlgoParams() override;
/**
* @brief 执行算法检测(实现纯虚函数)
* @param detectionDataCache 检测数据缓存的引用
*/
int ProcessAlgoDetection(std::vector<std::pair<EVzResultDataType, SVzLaserLineData>>& detectionDataCache) override;
/**
* @brief 获取检测数据类型(实现纯虚函数)
* 工件定位项目只使用Position点云数据
*/
EVzResultDataType GetDetectionDataType() override {
return keResultDataType_Position;
}
/**
* @brief 相机状态变化通知(实现纯虚函数)
*/
void OnCameraStatusChanged(int cameraIndex, bool isConnected) override;
/**
* @brief 工作状态变化通知(重写虚函数)
*
* 当BasePresenter的工作状态改变时此方法会被调用
* 在此调用UI回调接口通知状态变化
*/
void OnWorkStatusChanged(WorkStatus status) override;
/**
* @brief 相机数量变化通知(重写虚函数)
*
* 当相机初始化时,此方法会被调用
* 在此调用UI回调接口通知相机数量
*/
void OnCameraCountChanged(int count) override;
/**
* @brief 状态文字更新通知(重写虚函数)
*
* 当需要更新状态文字时,此方法会被调用
* 在此调用UI回调接口通知状态消息
*/
void OnStatusUpdate(const std::string& statusMessage) override;
private:
// TCP服务器相关方法
int InitTcpServer(int nPort);
int InitTCPServer(); // 初始化TCP服务器协议使用配置端口
bool startServer(quint16 port = 0); // port = 0 表示使用配置文件中的端口
void stopServer();
// TCP服务器回调处理方法
void onTcpDataReceivedFromCallback(const TCPClient* pClient, const char* pData, const unsigned int nLen);
void onTcpClientEventFromCallback(const TCPClient* pClient, TCPServerEventType eventType);
// TCP连接状态改变回调
void OnTCPConnectionChanged(bool connected);
// TCP检测触发回调
bool OnTCPDetectionTrigger(bool startWork, int cameraIndex, qint64 timestamp);
// 发送检测结果给TCP客户端
void _SendDetectionResultToTCP(const DetectionResult& detectionResult, int cameraIndex);
// 连接状态检查和更新
void CheckAndUpdateWorkStatus();
// 根据相机索引获取调平参数
SSG_planeCalibPara _GetCameraCalibParam(int cameraIndex);
// 更新当前执行参数
void _UpdateCurrentExecutionParams();
// 工件角点提取算法实现
bool _ExtractWorkpieceCorners(const QImage& inputImage, std::vector<Point2D>& corners,
std::vector<Point3D>& worldCorners, QImage& resultImage,
std::string& errorMessage);
// 透视校正
bool _PerspectiveCorrection(const std::vector<Point2D>& srcCorners,
const std::vector<Point2D>& dstCorners,
QImage& correctedImage);
private:
// WorkpiecePresenter 特有的成员变量
IVrConfig* m_vrConfig = nullptr;
ConfigResult m_configResult; // 配置结果
// TCP服务器相关
IYTCPServer* m_pTcpServer = nullptr;
TCPServerProtocol* m_pTCPServer = nullptr; // TCP服务器协议实例
quint16 m_port = 0;
bool m_bTcpClientConnected = false; // TCP客户端连接状态
bool m_bTCPConnected = false; // TCP客户端连接状态新协议
// 配置管理器
std::unique_ptr<ConfigManager> m_pConfigManager;
// 当前执行参数
CurrentExecutionParams m_currentExecutionParams; // 当前执行参数
// 检测处理器
DetectPresenter* m_pDetectPresenter = nullptr;
// 手眼标定矩阵列表
std::vector<CalibMatrix> m_clibMatrixList;
// 调试参数
VrDebugParam m_debugParam;
// 算法参数
VrAlgorithmParams m_algorithmParams;
};
#endif // WORKPIECEPRESENTER_H