Files
d330viewer/include/core/PointCloudProcessor.h

88 lines
2.2 KiB
C++

#ifndef POINTCLOUDPROCESSOR_H
#define POINTCLOUDPROCESSOR_H
#include <QObject>
#include <QByteArray>
#include <atomic>
#include <mutex>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <CL/cl.h>
class PointCloudProcessor : public QObject
{
Q_OBJECT
public:
explicit PointCloudProcessor(QObject *parent = nullptr);
~PointCloudProcessor();
bool initializeOpenCL();
void setCameraIntrinsics(float fx, float fy, float cx, float cy);
void setZScaleFactor(float scale);
void processDepthData(const QByteArray &depthData, uint32_t blockId);
void processPointCloudData(const QByteArray &cloudData, uint32_t blockId);
void setDenoiseEnabled(bool enabled);
void setDenoiseNeighborSupport(int minNeighbors);
void setDenoiseLowTailPermille(int permille);
void setDenoiseDepthBandPermille(int permille);
signals:
void pointCloudReady(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, uint32_t blockId);
void errorOccurred(const QString &error);
private:
pcl::PointCloud<pcl::PointXYZ>::Ptr applyDenoise(const pcl::PointCloud<pcl::PointXYZ>::Ptr &input);
void loadLowerCalibration();
void cleanupOpenCL();
float m_fx;
float m_fy;
float m_cx;
float m_cy;
float m_zScale;
int m_imageWidth;
int m_imageHeight;
int m_totalPoints;
cl_platform_id m_platform;
cl_device_id m_device;
cl_context m_context;
cl_command_queue m_queue;
cl_program m_program;
cl_kernel m_kernel;
cl_mem m_depthBuffer;
cl_mem m_xyzBuffer;
bool m_clInitialized;
std::atomic_bool m_denoiseEnabled;
float m_voxelLeafSize;
std::atomic_int m_denoiseNeighborSupport;
std::atomic_int m_denoiseLowTailPermille;
std::atomic_int m_denoiseDepthBandPermille;
// Calibration params aligned with lower-machine model
float m_k1;
float m_k2;
float m_p1;
float m_p2;
float m_p5;
float m_p6;
float m_p7;
float m_p8;
bool m_hasLowerCalibration;
// Temporal stabilizers for denoise to reduce frame-to-frame flicker.
std::mutex m_denoiseStateMutex;
bool m_hasAnchorMeanZ;
float m_anchorMeanZFiltered;
bool m_hasLowCutZ;
float m_lowCutZFiltered;
};
#endif // POINTCLOUDPROCESSOR_H