2 Commits

Author SHA1 Message Date
ea1a666619 配置页面2 2026-04-01 17:04:03 +08:00
50989bcd5b 配置页面 2026-04-01 15:55:42 +08:00
14 changed files with 495 additions and 64 deletions

25
HPPA/AppSettings.cpp Normal file
View File

@ -0,0 +1,25 @@
#include "AppSettings.h"
const QString AppSettings::kDefaultDataFolder = QStringLiteral("C:\\HPPA_image");
AppSettings::AppSettings()
: m_settings(QSettings::IniFormat, QSettings::UserScope,
QStringLiteral("IRIS"), QStringLiteral("HPPA"))
{
}
AppSettings& AppSettings::instance()
{
static AppSettings s;
return s;
}
QString AppSettings::dataFolder() const
{
return m_settings.value("General/DataFolder", kDefaultDataFolder).toString();
}
void AppSettings::setDataFolder(const QString& path)
{
m_settings.setValue("General/DataFolder", path);
}

26
HPPA/AppSettings.h Normal file
View File

@ -0,0 +1,26 @@
#pragma once
#include <QSettings>
#include <QString>
class AppSettings
{
public:
static AppSettings& instance();
// 数据路径
QString dataFolder() const;
void setDataFolder(const QString& path);
// 在此处添加更多参数的 getter/setter ...
private:
AppSettings();
AppSettings(const AppSettings&) = delete;
AppSettings& operator=(const AppSettings&) = delete;
QSettings m_settings;
// 默认值
static const QString kDefaultDataFolder;
};

View File

@ -107,6 +107,7 @@ HPPA::HPPA(QWidget* parent)
initPanelToolbar();
setDockNestingEnabled(true);
connect(this->ui.mSetting, SIGNAL(triggered()), this, SLOT(settingWindow()));
connect(this->ui.action_about, SIGNAL(triggered()), this, SLOT(onAbout()));
connect(this->ui.mActionOneMotorScenario, SIGNAL(triggered()), this, SLOT(createOneMotorScenario()));
connect(this->ui.mActionPlantPhenotypeScenario, SIGNAL(triggered()), this, SLOT(createPlantPhenotypeScenario()));
@ -1954,6 +1955,13 @@ void HPPA::onAbout()
about.exec();
}
void HPPA::settingWindow()
{
setWindow w;
w.show();
w.exec();
}
void HPPA::onDark()
{
QMessageBox msgBox;

View File

@ -73,6 +73,8 @@
#include "recordFrameCounter.h"
#include "setWindow.h"
#define PI 3.1415926
QT_CHARTS_USE_NAMESPACE//QChartView 使用 需要加宏, 否则无法使用
@ -313,6 +315,7 @@ public Q_SLOTS:
void onFocus2(int command);
void onFocusWindowClosed();
void onAbout();
void settingWindow();
void onDark();
void recordDarkFinish();
void onReference();

View File

@ -72,7 +72,7 @@ color:white;
</property>
<addaction name="mActionOpenImg"/>
<addaction name="separator"/>
<addaction name="action_11"/>
<addaction name="mSetting"/>
<addaction name="action_exit"/>
</widget>
<widget class="QMenu" name="menuspectrometer">
@ -797,7 +797,7 @@ QPushButton:pressed
<string>关闭影像</string>
</property>
</action>
<action name="action_11">
<action name="mSetting">
<property name="text">
<string>设置</string>
</property>

View File

@ -108,6 +108,7 @@
<ItemGroup>
<ClCompile Include="aboutWindow.cpp" />
<ClCompile Include="adjustTable.cpp" />
<ClCompile Include="AppSettings.cpp" />
<ClCompile Include="AspectRatioLabel.cpp" />
<ClCompile Include="CaptureCoordinator.cpp" />
<ClCompile Include="Carousel.cpp" />
@ -145,6 +146,7 @@
<ClCompile Include="ResononNirImager.cpp" />
<ClCompile Include="RgbCameraOperation.cpp" />
<ClCompile Include="RobotArmControl.cpp" />
<ClCompile Include="setWindow.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
@ -178,6 +180,7 @@
<QtUic Include="RadianceConversion.ui" />
<QtUic Include="ReflectanceConversion.ui" />
<QtUic Include="RobotArmControl.ui" />
<QtUic Include="set.ui" />
<QtUic Include="twoMotorControl.ui" />
</ItemGroup>
<ItemGroup>
@ -202,6 +205,7 @@
<QtMoc Include="imageControl.h" />
<QtMoc Include="AspectRatioLabel.h" />
<QtMoc Include="HyperImagerControl.h" />
<ClInclude Include="AppSettings.h" />
<ClInclude Include="imager_base.h" />
<ClInclude Include="irisximeaimager.h" />
<QtMoc Include="OneMotorControl.h" />
@ -224,6 +228,7 @@
<ClInclude Include="RasterDataProvider.h" />
<ClInclude Include="RasterRenderer.h" />
<QtMoc Include="recordFrameCounter.h" />
<QtMoc Include="setWindow.h" />
<ClInclude Include="utility_tc.h" />
<QtMoc Include="aboutWindow.h" />
<ClInclude Include="hppaConfigFile.h" />

View File

@ -199,6 +199,12 @@
<ClCompile Include="recordFrameCounter.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="setWindow.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AppSettings.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<QtMoc Include="fileOperation.h">
@ -324,6 +330,9 @@
<QtMoc Include="recordFrameCounter.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="setWindow.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup>
<ItemGroup>
<ClInclude Include="imageProcessor.h">
@ -365,6 +374,9 @@
<ClInclude Include="LayerTreeView.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="AppSettings.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<QtUic Include="FocusDialog.ui">
@ -403,6 +415,9 @@
<QtUic Include="hyperImagerControl.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtUic Include="set.ui">
<Filter>Form Files</Filter>
</QtUic>
</ItemGroup>
<ItemGroup>
<None Include="cpp.hint" />

View File

@ -1,4 +1,4 @@
#include "ImagerOperationBase.h"
#include "ImagerOperationBase.h"
ImagerOperationBase::ImagerOperationBase()
{
@ -44,11 +44,11 @@ void ImagerOperationBase::connect_imager(int frameNumber)
double ImagerOperationBase::auto_exposure()
{
//<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><EFBFBD>Ϊ<EFBFBD>ڵ<EFBFBD>ǰ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double x = 1 / getFramerate() * 1000;//<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><EFBFBD>
//第一步:先设置曝光时间为在当前帧率情况下最大
double x = 1 / getFramerate() * 1000;//获取最大毫秒曝光时间
setIntegrationTime(x);
//<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>Ѱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><EFBFBD>
//第二步:通过循环寻找最佳曝光时间
imagerStartCollect();
while (true)
@ -57,7 +57,7 @@ double ImagerOperationBase::auto_exposure()
if (GetMaxValue(buffer, m_FrameSize) >= 4094)
{
setIntegrationTime(getIntegrationTime() * 0.95);
std::cout << "<EFBFBD>Զ<EFBFBD><EFBFBD>ع<EFBFBD>-----------" << std::endl;
std::cout << "自动曝光-----------" << std::endl;
}
else
{
@ -69,7 +69,7 @@ double ImagerOperationBase::auto_exposure()
emit autoExposureSignal();
//std::cout << "<EFBFBD>Զ<EFBFBD><EFBFBD>ع⣺" << getIntegrationTime() << std::endl;
//std::cout << "自动曝光:" << getIntegrationTime() << std::endl;
return getIntegrationTime();
}
@ -79,7 +79,7 @@ void ImagerOperationBase::focus()
m_iFocusFramesNumber = 0;
m_iFocusFrameCounter = 1;
//std::cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>-----------" << std::endl;
//std::cout << "调焦-----------" << std::endl;
double tmpFrmerate = getFramerate();
double tmpIntegrationTime = getIntegrationTime();
@ -87,7 +87,7 @@ void ImagerOperationBase::focus()
setFramerate(5);
auto_exposure();
std::cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>" << getIntegrationTime() << std::endl;
std::cout << "调焦获得的曝光时间为:" << getIntegrationTime() << std::endl;
int iWidth, iHeight;
GetFrameSize(iWidth, iHeight);
@ -99,7 +99,7 @@ void ImagerOperationBase::focus()
m_bFocusControlState = true;
while (m_bFocusControlState)
{
////<EFBFBD><EFBFBD>֡ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
////多帧平均,减弱单帧跳动
//memset((void*)buffer, 0, m_FrameSize * sizeof(unsigned short));
//int fn = 5;
//for (int i = 0; i < fn; i++)
@ -123,7 +123,7 @@ void ImagerOperationBase::focus()
double focusIndex = calcFocusIndexSobelPrivate(buffer);
emit FocusIndexSobelSignal(focusIndex);
std::cout << "focusIndex<EFBFBD><EFBFBD>" << focusIndex << std::endl;
std::cout << "focusIndex" << focusIndex << std::endl;
emit SpectralSignal(1);
@ -140,7 +140,7 @@ void ImagerOperationBase::focus()
void ImagerOperationBase::record_dark()
{
std::cout << "<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << std::endl;
std::cout << "采集暗电流!!!!!!!!!" << std::endl;
imagerStartCollect();
unsigned int* dark_tmp = new unsigned int[m_FrameSize];
@ -172,7 +172,7 @@ void ImagerOperationBase::record_dark()
void ImagerOperationBase::record_white()
{
std::cout << "<EFBFBD>ɼ<EFBFBD><EFBFBD>װ壡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << std::endl;
std::cout << "采集白板!!!!!!!!!" << std::endl;
imagerStartCollect();
unsigned int* white_tmp = new unsigned int[m_FrameSize];
@ -197,7 +197,7 @@ void ImagerOperationBase::record_white()
imagerStopCollect();
//<EFBFBD>װ<EFBFBD><EFBFBD>۰<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//白板扣暗电流
if (m_HasDark)
{
for (size_t i = 0; i < m_FrameSize; i++)
@ -225,17 +225,17 @@ void ImagerOperationBase::start_record()
//std::cout << "------------------------------------------------------" << std::endl;
m_iFrameCounter = 0;
m_RgbImage->m_iFrameCounter = 0;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rgbͼ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>0<EFBFBD><EFBFBD>
m_RgbImage->m_iFrameCounter = 0;//设置填充rgb图像的第0行
m_bRecordControlState = true;
//<EFBFBD>ж<EFBFBD><EFBFBD>ڴ<EFBFBD>buffer<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//判断内存buffer是否正常分配
if (buffer == 0)
{
std::cerr << "Error: memory could not be allocated for datacube";
exit(EXIT_FAILURE);
}
// <EFBFBD>ڿ<EFBFBD>ʼ<EFBFBD>ɼ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD>UI <20><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD> MapLayer <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 在开始采集时仅发出文件信息UI 层自行创建 MapLayer 并管理生命周期
// prepare file name that will be used for saving
m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil";
QString baseName = QString::fromStdString(getFileNameFromPath(m_FileName2Save2));
@ -258,7 +258,7 @@ void ImagerOperationBase::start_record()
getFrame(buffer);
long long timeOs = getNanosecondsSinceMidnight();
//<EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӦΪbuffer<EFBFBD><EFBFBD>dark<EFBFBD><EFBFBD><EFBFBD><EFBFBD>unsigned short<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>dark>bufferʱ<EFBFBD><EFBFBD>buffer-dark=65535
//减去暗电流,应为bufferdark都是unsigned short,所以当dark>buffer时,buffer-dark=65535
if (m_HasDark)
{
for (size_t i = 0; i < m_FrameSize; i++)
@ -276,12 +276,12 @@ void ImagerOperationBase::start_record()
}
//ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//转反射率
if (m_HasWhite)
{
for (size_t i = 0; i < m_FrameSize; i++)
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ壩Ϊ0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//处理除数白板为0的情况
if (white[i] != 0)
{
pixelValueTmp = buffer[i];
@ -299,12 +299,12 @@ void ImagerOperationBase::start_record()
x = fwrite(buffer, 2, m_FrameSize, m_fImage);
fprintf(hTimesFile, "%d\n", timeOs);
//<EFBFBD><EFBFBD>rgb<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
//rgb波段提取出来,以便在界面中显示
m_RgbImage->FillRgbImage(buffer);//??????????????????????????????????????????????????????????????????????????????????????????????????????
//std::cout << "<EFBFBD><EFBFBD>" << m_iFrameCounter << "֡д<EFBFBD><EFBFBD>" << x << "<EFBFBD><EFBFBD>unsigned short<EFBFBD><EFBFBD>" << std::endl;
//std::cout << "" << m_iFrameCounter << "帧写了" << x << "unsigned short" << std::endl;
//ÿ<EFBFBD><EFBFBD>1s<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ν<EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>
//每隔1s进行一次界面图形绘制
if (m_iFrameCounter % (int)getFramerate() == 0)
{
emit PlotSignal(m_FileSavedCounter, m_iFrameCounter, filePath);
@ -318,15 +318,15 @@ void ImagerOperationBase::start_record()
}
imagerStopCollect();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>λ<EFBFBD>ͼǰ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//在最后一次画图前需要进行一次拉伸
//m_RgbImage
emit PlotSignal(m_FileSavedCounter, -1, filePath);
m_bRecordControlState = false;
WriteHdr();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ImageFileSaved <EFBFBD>źţ<EFBFBD>֪ͨ UI <20><><EFBFBD>Ѹ<EFBFBD><D1B8>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// m_FileName2Save2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˱<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD> .bil <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "tmp_image_0.bil"<EFBFBD><EFBFBD>
// 发射 ImageFileSaved 信号,通知 UI 层把该文件加入图层管理器
// m_FileName2Save2 保存了本次写入的 .bil 文件名(例如 "tmp_image_0.bil"
emit ImageFileSaved(QString::fromStdString(m_FileName2Save2), m_FileSavedCounter);
m_FileSavedCounter++;
@ -397,7 +397,7 @@ double ImagerOperationBase::calcFocusIndexSobelPrivate(void* pvData)
unsigned short* psData;
psData = (unsigned short*)pvData;
cv::Mat gray(iHeight, iWidth, CV_16UC1, psData);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD>gray.data<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD>psDataһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cv::Mat gray(iHeight, iWidth, CV_16UC1, psData);//经验证,gray.data的数据和psData一样;
/*string rgbFilePathNoStrech = "E:\\hppa\\delete\\focusImg_";
string tmp1 = std::to_string(m_iFocusFramesNumber);
string tmp2 = ".png";*/
@ -407,7 +407,7 @@ double ImagerOperationBase::calcFocusIndexSobelPrivate(void* pvData)
//cv::imwrite(rgbFilePathNoStrech, gray);
m_iFocusFramesNumber++;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
//进行滤波
//cv::Mat outputImage;
//cv::Size kernelSize(5, 5);
//double sigmaX = 1.5;
@ -417,7 +417,7 @@ double ImagerOperationBase::calcFocusIndexSobelPrivate(void* pvData)
cv::Mat gradX, gradY, absGradX, absGradY;
cv::Sobel(outputImage, gradX, CV_32F, 1, 0);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪCV_16S<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cv::magnitude<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cv::Sobel(outputImage, gradX, CV_32F, 1, 0);//如果参数为CV_16S则函数cv::magnitude报错
cv::Sobel(outputImage, gradY, CV_32F, 0, 1);
cv::convertScaleAbs(gradX, absGradX);
cv::convertScaleAbs(gradY, absGradY);
@ -426,7 +426,7 @@ double ImagerOperationBase::calcFocusIndexSobelPrivate(void* pvData)
cv::Mat magnitude, direction;
cv::magnitude(gradX, gradY, magnitude);//
cv::phase(gradX, gradY, direction, true); // true<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ؽǶȶ<EFBFBD><EFBFBD>ǻ<EFBFBD><EFBFBD><EFBFBD>
cv::phase(gradX, gradY, direction, true); // true表示返回角度而非弧度
return cv::mean(magnitude)[0];
@ -479,23 +479,23 @@ int ImagerOperationBase::getFocusFrameCounter() const
void ImagerOperationBase::set_buffer()
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//如果
if (buffer != nullptr)
{
std::cout << "<EFBFBD>ͷŶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>" << std::endl;
std::cout << "释放堆上内存" << std::endl;
free(buffer);
}
m_FrameSize = getBandCount() * getSampleCount();
//std::cout << "m_FrameSize<EFBFBD><EFBFBD>СΪ" << m_FrameSize << std::endl;
//std::cout << "m_FrameSize大小为" << m_FrameSize << std::endl;
buffer = new unsigned short[m_FrameSize];
dark = new unsigned short[m_FrameSize];
white = new unsigned short[m_FrameSize];
std::cout << "buffer<EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ַ" << buffer << std::endl;
std::cout << "dark<EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ַ" << dark << std::endl;
std::cout << "white<EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ַ" << white << std::endl;
std::cout << "buffer内存地址" << buffer << std::endl;
std::cout << "dark内存地址" << dark << std::endl;
std::cout << "white内存地址" << white << std::endl;
}
void ImagerOperationBase::WriteHdr()
@ -540,6 +540,6 @@ unsigned short ImagerOperationBase::GetMaxValue(unsigned short* dark, int number
max = dark[i];
}
}
//std::cout << "<EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ" << max << std::endl;
//std::cout << "本帧最大值为" << max << std::endl;
return max;
}

View File

@ -1,4 +1,4 @@
#pragma once
#pragma once
#include <QObject>
#include <QString>
@ -49,7 +49,7 @@ public:
int getFrameCounter() const;
int getFocusFrameCounter() const;
unsigned short* buffer;//<EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>д<EFBFBD>뵽Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned short* buffer;//存储采集到的影像的中间变量,下一步写入到硬盘中
void set_buffer();
void setFileName2Save(string FileName);
@ -60,25 +60,25 @@ public:
protected:
CImage* m_RgbImage;//<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>rgbͼ<EFBFBD><EFBFBD>
bool m_bRecordControlState;//<EFBFBD>ɼ<EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD>ֹͣ<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int m_iFrameCounter;//<EFBFBD><EFBFBD>¼<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD>
int m_iFocusFrameCounter;//<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD>
int m_FrameSize;//<EFBFBD><EFBFBD>ʾһ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>ٸ<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>m_FrameSize = m_imager.get_band_count()*m_imager.get_sample_count();
int m_iFrameNumber;//<EFBFBD><EFBFBD>Ҫ<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD>
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;//需要采集的总帧数
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
string m_FileName2Save;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
//以下两个参数用于给保存的影像文件命名
string m_FileName2Save;//保存的影像文件名
string m_FileName2Save2;
int m_FileSavedCounter;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˼<EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
int m_FileSavedCounter;//保存了几个影像文件
bool m_HasDark;//<EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD>˰<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊtrue
bool m_HasWhite;//<EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD>˰װ<EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊtrue
bool m_HasDark;//当采集了暗电流之后,设置为true
bool m_HasWhite;//当采集了白板之后,设置为true
unsigned short* dark;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned short* white;//<EFBFBD><EFBFBD>װ<EFBFBD>
unsigned short* dark;//存储暗电流
unsigned short* white;//存储白板
bool m_bFocusControlState;//<EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool m_bFocusControlState;//控制调焦结束
@ -92,7 +92,7 @@ private:
double calcFocusIndexSobelPrivate(void* pvData);
public slots:
virtual void connect_imager(int frameNumber);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><EFBFBD><EFBFBD>
virtual void connect_imager(int frameNumber);//连接相机、开辟缓存
virtual double auto_exposure();
virtual void focus();
virtual void start_record();
@ -102,10 +102,10 @@ public slots:
void getFocusIndexSobel();
signals:
void PlotSignal(int, int, QString);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD>źţ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD>񣻵ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1<><31><EFBFBD><EFBFBD><EFBFBD>˴βɼ<CEB2><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>
void RecordFinishedSignal_WhenFrameNumberMeet();//<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_iFrameNumber<EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void RecordFinishedSignal_WhenFrameNumberNotMeet();//<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_iFrameNumber<EFBFBD><EFBFBD>û<EFBFBD>вɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD>;ֹͣ<EFBFBD>ɼ<EFBFBD>
void SpectralSignal(int);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƹ<EFBFBD><EFBFBD>ף<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>
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();
@ -113,12 +113,12 @@ signals:
void FocusIndexSobelSignal(double);
void testImagerStatus();//<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void testImagerStatus();//表示可以测试相机连接状态:是否连接,并反映到界面上
void autoExposureSignal();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>.bil/.hdr<64><72>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ɺ󷢳<C9BA><F3B7A2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳɼ<D3B2><C9BC>̷߳<DFB3><CCB7><EFBFBD><EFBFBD><EFBFBD>Qt <20><><EFBFBD><EFBFBD> queued connection<EFBFBD><EFBFBD>
// 新增:当一组影像文件(.bil/.hdr写入完成后发出会从采集线程发出Qt 会做 queued connection
void ImageFileSaved(const QString& path, int fileIndex);
// <EFBFBD>޸ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><EFBFBD><EFBFBD> MapLayer*<2A><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>UI <20><EFBFBD>𴴽<EFBFBD> MapLayer <20><><EFBFBD>󲢹<EFBFBD><F3B2A2B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 修改:不再直接发送 MapLayer*而是发送文件名与文件路径UI 层负责创建 MapLayer 对象并管理生命周期
void LayerFileCreated(const QString& baseName, const QString& filePath, int fileIndex);
};

View File

@ -1,5 +1,6 @@
#include "stdafx.h"
#include "fileOperation.h"
#include "AppSettings.h"
FileOperation::FileOperation()
{
@ -27,6 +28,11 @@ string FileOperation::getDirectoryOfExe()
string FileOperation::getDirectoryFromString(string directory)
{
if (directory.empty())
{
directory = AppSettings::instance().dataFolder().toStdString();
}
QString tmp = QString::fromStdString(directory);
QDir dir;
if (!dir.exists(tmp))
@ -41,7 +47,7 @@ bool FileOperation::copyFile(QString source, QString target)
{
string source1 = source.toStdString();
string target1 = target.toStdString();
char buffer[256];
int n;

View File

@ -17,7 +17,7 @@ public:
~FileOperation();
string getDirectoryOfExe();//getDirectoryOfExe
string getDirectoryFromString(string directory="C:\\HPPA_image");
string getDirectoryFromString(string directory="");

267
HPPA/set.ui Normal file
View File

@ -0,0 +1,267 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>setDialog</class>
<widget class="QDialog" name="setDialog">
<property name="windowModality">
<enum>Qt::ApplicationModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>486</width>
<height>229</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QWidget" name="contentWidget" native="true">
<property name="styleSheet">
<string notr="true">QWidget #contentWidget
{
background: #040125;
/*border-radius: 8px 8px 8px 8px;*/
border: 1px solid #2f6bff;
}
QLineEdit {
background-color: #142D7F;
color: #e6eeff;
border: 1px solid #2f6bff;
border-radius: 6px;
padding: 4px 8px;
min-width: 70px;
min-height: 20px;
font-size: 13px;
}
QLabel {
color: rgb(255, 255, 255);
}
QPushButton
{
/*width: 172px;
height: 56px;*/
font: 10pt &quot;新宋体&quot;;
background-color: qlineargradient(
spread:pad,
x1:0.5, y1:0, x2:0.5, y2:1,
stop:0 #283D86,
stop:1 #0F1A40
);
color: white;
border: none;
padding: 8px 8px;
border-radius: 4px;
}
QPushButton:hover
{
background-color: qlineargradient(
spread:pad,
x1:0, y1:0, x2:1, y2:0,
stop:0 #3A4875,
stop:1 #5F6B91
);
}
/* 按下时的效果 */
QPushButton:pressed
{
background-color: qlineargradient(
spread:pad,
x1:0, y1:0, x2:1, y2:0,
stop:0 #1A254F,
stop:1 #3A466B
);
/* 可选:添加下压效果 */
padding-top: 9px;
padding-bottom: 7px;
}
</string>
</property>
<layout class="QGridLayout" name="gridLayout_7">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>10</number>
</property>
<item row="0" column="0">
<widget class="QWidget" name="titlebarWidget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>43</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>43</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">QWidget #titlebarWidget
{
background: #0E1C4C;
border: 1px solid #2f6bff;
}</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="0">
<widget class="QLabel" name="iconLabel">
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="HPPA.qrc">:/png/resources/icons/png/Spectral_Insight_27.png</pixmap>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_9">
<property name="styleSheet">
<string notr="true">QLabel
{
color:#E2EDFF;
}</string>
</property>
<property name="text">
<string>设置</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>505</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="3">
<widget class="QPushButton" name="closeBtn">
<property name="styleSheet">
<string notr="true">QPushButton
{
/*width: 172px;
height: 56px;*/
font: 10pt &quot;新宋体&quot;;
background-color: qlineargradient(
spread:pad,
x1:0.5, y1:0, x2:0.5, y2:1,
stop:0 #283D86,
stop:1 #0F1A40
);
color: white;
border: none;
padding: 8px 8px;
border-radius: 4px;
}
QPushButton:hover
{
background-color: qlineargradient(
spread:pad,
x1:0, y1:0, x2:1, y2:0,
stop:0 #3A4875,
stop:1 #5F6B91
);
}
/* 按下时的效果 */
QPushButton:pressed
{
background-color: qlineargradient(
spread:pad,
x1:0, y1:0, x2:1, y2:0,
stop:0 #1A254F,
stop:1 #3A466B
);
/* 可选:添加下压效果 */
padding-top: 9px;
padding-bottom: 7px;
}</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="HPPA.qrc">
<normaloff>:/svg/resources/icons/svg/close.svg</normaloff>:/svg/resources/icons/svg/close.svg</iconset>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QWidget" name="widget" native="true">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>数据路径</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="dataFolderLineEdit"/>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="dataFolderBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="HPPA.qrc"/>
</resources>
<connections/>
</ui>

49
HPPA/setWindow.cpp Normal file
View File

@ -0,0 +1,49 @@
#include "setWindow.h"
#include "AppSettings.h"
#include <QSvgRenderer>
#include <QPainter>
#include <QFileDialog>
setWindow::setWindow(QWidget* parent)
{
ui.setupUi(this);
setWindowFlags(Qt::FramelessWindowHint);
connect(this->ui.closeBtn, SIGNAL(released()), this, SLOT(onExit()));
connect(this->ui.dataFolderBtn, SIGNAL(clicked()), this, SLOT(onSelectDataFolder()));
loadSettings();
}
setWindow::~setWindow()
{
}
void setWindow::loadSettings()
{
ui.dataFolderLineEdit->setText(AppSettings::instance().dataFolder());
}
void setWindow::saveSettings()
{
AppSettings::instance().setDataFolder(ui.dataFolderLineEdit->text());
}
void setWindow::onSelectDataFolder()
{
QString dir = QFileDialog::getExistingDirectory(this,
QString::fromLocal8Bit("选择数据保存路径"),
ui.dataFolderLineEdit->text());
if (!dir.isEmpty())
{
ui.dataFolderLineEdit->setText(dir);
}
}
void setWindow::onExit()
{
saveSettings();
this->close();
}

27
HPPA/setWindow.h Normal file
View File

@ -0,0 +1,27 @@
#pragma once
#include <QtWidgets/qdialog.h>
#include <qstring.h>
#include "ui_set.h"
class setWindow :public QDialog
{
Q_OBJECT
public:
setWindow(QWidget* parent = Q_NULLPTR);
~setWindow();
private:
Ui::setDialog ui;
void loadSettings();
void saveSettings();
public Q_SLOTS:
void onExit();
void onSelectDataFolder();
signals:
};