#pragma once #include #include #include "image2display.h" #include "fileOperation.h" #include #include #include "ImagerOperationBase.h" #include "utility_tc.h" class MapLayer; // forward declaration class ImagerOperationBase :public QObject { Q_OBJECT public: ImagerOperationBase(); ~ImagerOperationBase(); virtual double getWavelengthAtBand(int band) = 0; virtual int getBandCount() = 0; virtual int getSampleCount() = 0; virtual double getFramerate() = 0; virtual double getIntegrationTime() = 0; virtual double getGain() = 0; virtual void setFramerate(const double frames_per_second) = 0; virtual void setIntegrationTime(const double milliseconds) = 0; virtual void setGain(const double gain) = 0; virtual int getStartBand() = 0; virtual int getEndBand() = 0; virtual void connectImager(const char* camera_sn = NULL) = 0; virtual void disconnectImager() = 0; virtual void imagerStartCollect() = 0; virtual void imagerStopCollect() = 0; virtual unsigned short* getFrame(unsigned short* buffer) = 0; virtual void setSpectraBin(int new_spectral_bin) = 0; CImage* getRgbImage() const; cv::Mat* getMatRgbImage() const; cv::Mat* getMatFocusGrayImage() const; QImage getQImageFocusGrayImage() const; bool getRecordControlState() const; void setRecordControlState(bool RecordControlState); int getFrameCounter() const; int getFocusFrameCounter() const; unsigned short* buffer;//存储采集到的影像的中间变量,下一步写入到硬盘中 void set_buffer(); void setFileName2Save(string FileName); void setFrameNumber(int FrameNumber); void setFocusControlState(bool FocusControlState); int GetFrameSize(int& iWidth, int& iHeight); protected: CImage* m_RgbImage;//显示的rgb图像 bool m_bRecordControlState;//采集状态;可用于执行停止采集操作 int m_iFrameCounter;//记录采集的帧数 int m_iFocusFrameCounter;//记录调焦时采集的帧数 int m_FrameSize;//表示一帧代表有多少个数值:m_FrameSize = m_imager.get_band_count()*m_imager.get_sample_count(); int m_iFrameNumber;//需要采集的总帧数 //以下两个参数用于给保存的影像文件命名 string m_FileName2Save;//保存的影像文件名 string m_FileName2Save2; int m_FileSavedCounter;//保存了几个影像文件 bool m_HasDark;//当采集了暗电流之后,设置为true bool m_HasWhite;//当采集了白板之后,设置为true unsigned short* dark;//存储暗电流 unsigned short* white;//存储白板 bool m_bFocusControlState;//控制调焦结束 virtual void WriteHdr(); unsigned short GetMaxValue(unsigned short* dark, int number); private: int m_iFocusFramesNumber; double calcFocusIndexSobelPrivate(void* pvData); public slots: virtual void connect_imager(int frameNumber);//连接相机、开辟缓存 virtual double auto_exposure(); virtual void focus(); virtual void start_record(); void stop_record(); virtual void record_dark(); virtual void record_white(); void getFocusIndexSobel(); void updateRecordingFileInfo(const QString& filePath, const QString& baseName, int frameNumber); signals: void PlotSignal(int, int, QString);//绘制影像信号,第一个参数:第几个影像;第二个参数:采集到的帧数,-1代表此次采集的最后一次绘制 void RecordFinishedSignal_WhenFrameNumberMeet();//采集完成信号:需要采集的总帧数(m_iFrameNumber)采集完成 void RecordFinishedSignal_WhenFrameNumberNotMeet();//采集完成信号:需要采集的总帧数(m_iFrameNumber)没有采集完成,中途停止采集 void SpectralSignal(int);//发射1代表正在调焦,绘制光谱,发射0表示调焦完成; void RecordWhiteFinishSignal(); void RecordDarlFinishSignal(); void FocusIndexSobelSignal(double); void testImagerStatus();//表示可以测试相机连接状态:是否连接,并反映到界面上 void autoExposureSignal(); // 新增:当一组影像文件(.bil/.hdr)写入完成后发出(会从采集线程发出,Qt 会做 queued connection) void ImageFileSaved(const QString& path, int fileIndex); // 修改:不再直接发送 MapLayer*,而是发送文件名与文件路径,UI 层负责创建 MapLayer 对象并管理生命周期 void LayerFileCreated(const QString& baseName, const QString& filePath, int fileIndex); };