From 1a64fb32e3a606bd5e38da0aae26111875311fcd Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Thu, 3 Sep 2026 17:18:24 +0800 Subject: [PATCH] =?UTF-8?q?fix=201=E3=80=81=E9=BB=98=E8=AE=A4=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E6=B3=A2=E6=AE=B5=EF=BC=9A=E5=8F=AF=E8=A7=81=E5=85=89?= =?UTF-8?q?=E3=80=81=E8=BF=91=E7=BA=A2=E5=A4=96=EF=BC=8C=E9=87=87=E9=9B=86?= =?UTF-8?q?=E4=B8=AD=E3=80=81=E6=89=93=E5=BC=80=E6=96=87=E4=BB=B6=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HPPA/HPPA.cpp | 43 +++++++++++++++++++++++++++++------- HPPA/HPPA.h | 6 ++--- HPPA/ImagerOperationBase.cpp | 4 ++-- HPPA/ImagerOperationBase.h | 2 +- HPPA/RasterImageLayer.cpp | 30 ++++++++++++++++++++++++- HPPA/RasterImageLayer.h | 2 +- HPPA/ResononNirImager.cpp | 5 +++-- HPPA/about.ui | 2 +- HPPA/image2display.cpp | 8 +++---- HPPA/image2display.h | 2 +- 10 files changed, 80 insertions(+), 24 deletions(-) diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index 540aaca..45c7188 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -2595,7 +2595,7 @@ void HPPA::onconnect() connect(m_Imager, SIGNAL(RecordDarlFinishSignal()), this, SLOT(recordDarkFinish())); // Connect LayerFileCreated from imager to HPPA slot - connect(m_Imager, SIGNAL(LayerFileCreated(QString,QString,int)), this, SLOT(onLayerCreatedFromFile(QString,QString,int))); + connect(m_Imager, SIGNAL(LayerFileCreated(QString,QString,int, QString)), this, SLOT(onLayerCreatedFromFile(QString,QString,int, QString))); connect(this->ui.actionOpenDirectory, SIGNAL(triggered()), this, SLOT(onActionOpenDirectory())); @@ -3107,22 +3107,22 @@ void WorkerThread3::run() emit AutoFocusFinishedSignal(); } -void HPPA::onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex) +void HPPA::onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex, const QString& hyperimagerTppe) { if (!m_LayerTreeModel || !m_RasterGroup) return; if (ui.mAction3DPlantPhenotypeScenario->isChecked()) { //addLayer(baseName, filePath, false, false); - addLayer(baseName, filePath, false); + addLayer(baseName, filePath, false, true, hyperimagerTppe); } else { - addLayer(baseName, filePath, false); + addLayer(baseName, filePath, false, true, hyperimagerTppe); } } -void HPPA::addLayer(const QString& baseName, const QString& filePath,bool refresh, bool isAddImage) +void HPPA::addLayer(const QString& baseName, const QString& filePath,bool refresh, bool isAddImage, const QString& hyperimagerTppe) { // Create MapLayer first and attach it to a LayerTreeLayerNode RasterLayer* ml = new RasterLayer(baseName, filePath); @@ -3139,14 +3139,41 @@ void HPPA::addLayer(const QString& baseName, const QString& filePath,bool refres if (isAddImage) { - newImage(ml, RasterImageLayer::RendererType::Multiband, node, refresh); + newImage(ml, RasterImageLayer::RendererType::Multiband, node, refresh, hyperimagerTppe); } } -void HPPA::newImage(RasterLayer* ml, RasterImageLayer::RendererType type, LayerTreeNode* parent, bool refresh) +void HPPA::newImage(RasterLayer* ml, RasterImageLayer::RendererType type, LayerTreeNode* parent, bool refresh, const QString& hyperimagerTppe) { QWidget* mapcavasContainer = onCreateTab(ml->name()); - RasterImageLayer* rasterImageLayer = new RasterImageLayer(ml, type); + RasterImageLayer* rasterImageLayer; + + //当边采集边显示时,需要修改rasterImageLayer默认渲染波段 + if (hyperimagerTppe== "visibleLight") + { + rasterImageLayer = new RasterImageLayer(ml, type, false); + + auto params = rasterImageLayer->multibandParams(); + params.rWave = 665; + params.gWave = 560; + params.bWave = 490; + rasterImageLayer->setMultibandParams(params); + } + else if (hyperimagerTppe == "nearInfrared") + { + rasterImageLayer = new RasterImageLayer(ml, type, false); + + auto params = rasterImageLayer->multibandParams(); + params.rWave = 1500; + params.gWave = 1300; + params.bWave = 1100; + rasterImageLayer->setMultibandParams(params); + } + else//当打开影像文件时,rasterImageLayer默认渲染波段由头文件决定 + { + rasterImageLayer = new RasterImageLayer(ml, type, true); + } + QList mapcavas = mapcavasContainer->findChildren(); if (mapcavas.size() == 0) { diff --git a/HPPA/HPPA.h b/HPPA/HPPA.h index 36877fc..3c52ec2 100644 --- a/HPPA/HPPA.h +++ b/HPPA/HPPA.h @@ -430,9 +430,9 @@ public Q_SLOTS: void createMicroscopicMotionControlScenario(); void onCreated3DModelOneMotor(); - void addLayer(const QString& baseName, const QString& filePath, bool refresh, bool isAddImage = true); - void newImage(RasterLayer* ml, RasterImageLayer::RendererType, LayerTreeNode* parent, bool refresh=true); - void onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex); + void addLayer(const QString& baseName, const QString& filePath, bool refresh, bool isAddImage = true, const QString& hyperimagerTppe=""); + void newImage(RasterLayer* ml, RasterImageLayer::RendererType, LayerTreeNode* parent, bool refresh=true, const QString& hyperimagerTppe=""); + void onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex, const QString& hyperimagerTppe); void removeLayerByTreeIndex(); void removeLayerByNode(LayerTreeNode* node); void showColorImageByTreeIndex(); diff --git a/HPPA/ImagerOperationBase.cpp b/HPPA/ImagerOperationBase.cpp index 4c3bda1..86fb75b 100644 --- a/HPPA/ImagerOperationBase.cpp +++ b/HPPA/ImagerOperationBase.cpp @@ -252,7 +252,7 @@ void ImagerOperationBase::start_record() m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil"; QString baseName = QString::fromStdString(getFileNameFromPath(m_FileName2Save2)); QString filePath = QString::fromStdString(m_FileName2Save2); - emit LayerFileCreated(baseName, filePath, m_FileSavedCounter); + emit LayerFileCreated(baseName, filePath, m_FileSavedCounter, "visibleLight"); FILE* m_fImage = fopen(m_FileName2Save2.c_str(), "w+b"); @@ -314,7 +314,7 @@ void ImagerOperationBase::start_record() fprintf(hTimesFile, "%ll\n", timeOs); //将rgb波段提取出来,以便在界面中显示 - m_RgbImage->FillRgbImage(buffer);//?????????????????????????????????????????????????????????????????????????????????????????????????????? + m_RgbImage->FillRgbImage(buffer, 121, 79, 40);//?????????????????????????????????????????????????????????????????????????????????????????????????????? //std::cout << "第" << m_iFrameCounter << "帧写了" << x << "个unsigned short。" << std::endl; diff --git a/HPPA/ImagerOperationBase.h b/HPPA/ImagerOperationBase.h index 77adf6e..6da4fde 100644 --- a/HPPA/ImagerOperationBase.h +++ b/HPPA/ImagerOperationBase.h @@ -123,5 +123,5 @@ signals: void ImageFileSaved(const QString& path, int fileIndex); // 修改:不再直接发送 MapLayer*,而是发送文件名与文件路径,UI 层负责创建 MapLayer 对象并管理生命周期 - void LayerFileCreated(const QString& baseName, const QString& filePath, int fileIndex); + void LayerFileCreated(const QString& baseName, const QString& filePath, int fileIndex, const QString& hyperimagerTppe); }; diff --git a/HPPA/RasterImageLayer.cpp b/HPPA/RasterImageLayer.cpp index 2fd41f5..317769c 100644 --- a/HPPA/RasterImageLayer.cpp +++ b/HPPA/RasterImageLayer.cpp @@ -5,11 +5,39 @@ #include "MultibandRasterRenderer.h" #include "SinglebandRasterRenderer.h" -RasterImageLayer::RasterImageLayer(RasterLayer* layer, RendererType type) +RasterImageLayer::RasterImageLayer(RasterLayer* layer, RendererType type, bool initRenderParamsFromFile) : m_layer(layer) , m_rendererType(type) , m_rendererInitialized(false) { + if (initRenderParamsFromFile) + { + // 此处根据头文件(打开影像文件)修改默认渲染波段,只对打开文件的情况下有效; + // 当边采集边显示时(initRenderParamsFromFile设置为false),应该在实例化RasterImageLayer后调用setMultibandParams设置默认渲染波段 + try + { + if (!m_layer) return; + + std::vector wavelengths = m_layer->bandWavelengths(); + if (wavelengths.empty()) return; + + std::sort(wavelengths.begin(), wavelengths.end()); + double m_minWave = wavelengths.front(); + double m_maxWave = wavelengths.back(); + + if (m_minWave > 800 && m_maxWave > 1600) + { + m_multibandParams.rWave = 1500; + m_multibandParams.gWave = 1300; + m_multibandParams.bWave = 1100; + } + } + catch (const std::exception&) + { + + } + + } } void RasterImageLayer::ensureRenderer() diff --git a/HPPA/RasterImageLayer.h b/HPPA/RasterImageLayer.h index b791e46..80de8ca 100644 --- a/HPPA/RasterImageLayer.h +++ b/HPPA/RasterImageLayer.h @@ -19,7 +19,7 @@ public: Singleband }; - RasterImageLayer(RasterLayer* layer, RendererType type); + RasterImageLayer(RasterLayer* layer, RendererType type, bool initRenderParamsFromFile); ~RasterImageLayer(); void ensureRenderer(); diff --git a/HPPA/ResononNirImager.cpp b/HPPA/ResononNirImager.cpp index 1ba3496..afb9750 100644 --- a/HPPA/ResononNirImager.cpp +++ b/HPPA/ResononNirImager.cpp @@ -293,7 +293,7 @@ void ResononNirImager::start_record() m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil"; QString baseName = QString::fromStdString(getFileNameFromPath(m_FileName2Save2)); QString filePath = QString::fromStdString(m_FileName2Save2); - emit LayerFileCreated(baseName, filePath, m_FileSavedCounter); + emit LayerFileCreated(baseName, filePath, m_FileSavedCounter, "nearInfrared"); FILE* m_fImage = fopen(m_FileName2Save2.c_str(), "w+b"); @@ -355,7 +355,8 @@ void ResononNirImager::start_record() fprintf(hTimesFile, "%ll\n", timeOs); //将rgb波段提取出来,以便在界面中显示 - m_RgbImage->FillRgbImage(buffer);//?????????????????????????????????????????????????????????????????????????????????????????????????????? + //需要修改函数m_RgbImage->FillRgbImage,接收参数:提取rgb的偏移,参数由相机类型、单帧大小、波长范围等确定 + m_RgbImage->FillRgbImage(buffer, 172, 112, 52);//?????????????????????????????????????????????????????????????????????????????????????????????????????? //std::cout << "第" << m_iFrameCounter << "帧写了" << x << "个unsigned short。" << std::endl; diff --git a/HPPA/about.ui b/HPPA/about.ui index bc2e921..388eedd 100644 --- a/HPPA/about.ui +++ b/HPPA/about.ui @@ -288,7 +288,7 @@ QPushButton:pressed } - 版本:3.1.3 + 版本:3.1.4 diff --git a/HPPA/image2display.cpp b/HPPA/image2display.cpp index 56ca9a5..93be55e 100644 --- a/HPPA/image2display.cpp +++ b/HPPA/image2display.cpp @@ -64,7 +64,7 @@ void CImage::SetRgbImageWidthAndHeight(int BandCount, int Sample, int FrameNumbe //std::cout << "rgb影像内存地址为:" << m_QRgbImage << std::endl; } -void CImage::FillRgbImage(unsigned short *datacube) +void CImage::FillRgbImage(unsigned short *datacube, int rBandNumber, int gBandNumber, int bBandNumber) { //uchar==unsigned char,内存大小:1个字节,范围为0-255 //uchar * imagebits24 = m_QRgbImage->bits(); @@ -78,9 +78,9 @@ void CImage::FillRgbImage(unsigned short *datacube) //std::cout << "rgb图像写入数据帧数:" << j << std::endl; //取值:一帧影像中,从左到右的rgb像元值 - r = *(datacube + 121 * m_iSampleNumber + j); - g = *(datacube + 79 * m_iSampleNumber + j); - b = *(datacube + 40 * m_iSampleNumber + j); + r = *(datacube + rBandNumber * m_iSampleNumber + j); + g = *(datacube + gBandNumber * m_iSampleNumber + j); + b = *(datacube + bBandNumber * m_iSampleNumber + j); //将像元值赋值到cv::Mat中,操作像元值:https://zhuanlan.zhihu.com/p/51842288 //int dataType = m_matRgbImage->type();//当数据类型为CV_16UC3时,返回18 diff --git a/HPPA/image2display.h b/HPPA/image2display.h index 2fa11ca..e1aa9b8 100644 --- a/HPPA/image2display.h +++ b/HPPA/image2display.h @@ -21,7 +21,7 @@ public: CImage(QWidget* pParent = NULL); //~CImage(); void SetRgbImageWidthAndHeight(int BandCount, int Sample, int FrameNumber); - void FillRgbImage(unsigned short *datacube); + void FillRgbImage(unsigned short *datacube, int rBandNumber, int gBandNumber, int bBandNumber); void FillFocusGrayImage(unsigned short *datacube); void FillFocusGrayQImage(unsigned short * datacube);