1、默认渲染波段:可见光、近红外,采集中、打开文件;
This commit is contained in:
tangchao0503
2026-09-03 17:18:24 +08:00
parent ebc39f9f9d
commit 1a64fb32e3
10 changed files with 80 additions and 24 deletions

View File

@ -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*> mapcavas = mapcavasContainer->findChildren<Mapcavas*>();
if (mapcavas.size() == 0)
{

View File

@ -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();

View File

@ -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;

View File

@ -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);
};

View File

@ -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<double> 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()

View File

@ -19,7 +19,7 @@ public:
Singleband
};
RasterImageLayer(RasterLayer* layer, RendererType type);
RasterImageLayer(RasterLayer* layer, RendererType type, bool initRenderParamsFromFile);
~RasterImageLayer();
void ensureRenderer();

View File

@ -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;

View File

@ -288,7 +288,7 @@ QPushButton:pressed
}</string>
</property>
<property name="text">
<string>版本:3.1.3</string>
<string>版本:3.1.4</string>
</property>
</widget>
</item>

View File

@ -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

View File

@ -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);