Compare commits
2 Commits
7e119fbf91
...
ea1a666619
| Author | SHA1 | Date | |
|---|---|---|---|
| ea1a666619 | |||
| 50989bcd5b |
25
HPPA/AppSettings.cpp
Normal file
25
HPPA/AppSettings.cpp
Normal 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
26
HPPA/AppSettings.h
Normal 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;
|
||||||
|
};
|
||||||
@ -107,6 +107,7 @@ HPPA::HPPA(QWidget* parent)
|
|||||||
initPanelToolbar();
|
initPanelToolbar();
|
||||||
|
|
||||||
setDockNestingEnabled(true);
|
setDockNestingEnabled(true);
|
||||||
|
connect(this->ui.mSetting, SIGNAL(triggered()), this, SLOT(settingWindow()));
|
||||||
connect(this->ui.action_about, SIGNAL(triggered()), this, SLOT(onAbout()));
|
connect(this->ui.action_about, SIGNAL(triggered()), this, SLOT(onAbout()));
|
||||||
connect(this->ui.mActionOneMotorScenario, SIGNAL(triggered()), this, SLOT(createOneMotorScenario()));
|
connect(this->ui.mActionOneMotorScenario, SIGNAL(triggered()), this, SLOT(createOneMotorScenario()));
|
||||||
connect(this->ui.mActionPlantPhenotypeScenario, SIGNAL(triggered()), this, SLOT(createPlantPhenotypeScenario()));
|
connect(this->ui.mActionPlantPhenotypeScenario, SIGNAL(triggered()), this, SLOT(createPlantPhenotypeScenario()));
|
||||||
@ -1954,6 +1955,13 @@ void HPPA::onAbout()
|
|||||||
about.exec();
|
about.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HPPA::settingWindow()
|
||||||
|
{
|
||||||
|
setWindow w;
|
||||||
|
w.show();
|
||||||
|
w.exec();
|
||||||
|
}
|
||||||
|
|
||||||
void HPPA::onDark()
|
void HPPA::onDark()
|
||||||
{
|
{
|
||||||
QMessageBox msgBox;
|
QMessageBox msgBox;
|
||||||
|
|||||||
@ -73,6 +73,8 @@
|
|||||||
|
|
||||||
#include "recordFrameCounter.h"
|
#include "recordFrameCounter.h"
|
||||||
|
|
||||||
|
#include "setWindow.h"
|
||||||
|
|
||||||
#define PI 3.1415926
|
#define PI 3.1415926
|
||||||
|
|
||||||
QT_CHARTS_USE_NAMESPACE//QChartView 使用 需要加宏, 否则无法使用
|
QT_CHARTS_USE_NAMESPACE//QChartView 使用 需要加宏, 否则无法使用
|
||||||
@ -313,6 +315,7 @@ public Q_SLOTS:
|
|||||||
void onFocus2(int command);
|
void onFocus2(int command);
|
||||||
void onFocusWindowClosed();
|
void onFocusWindowClosed();
|
||||||
void onAbout();
|
void onAbout();
|
||||||
|
void settingWindow();
|
||||||
void onDark();
|
void onDark();
|
||||||
void recordDarkFinish();
|
void recordDarkFinish();
|
||||||
void onReference();
|
void onReference();
|
||||||
|
|||||||
@ -72,7 +72,7 @@ color:white;
|
|||||||
</property>
|
</property>
|
||||||
<addaction name="mActionOpenImg"/>
|
<addaction name="mActionOpenImg"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="action_11"/>
|
<addaction name="mSetting"/>
|
||||||
<addaction name="action_exit"/>
|
<addaction name="action_exit"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menuspectrometer">
|
<widget class="QMenu" name="menuspectrometer">
|
||||||
@ -797,7 +797,7 @@ QPushButton:pressed
|
|||||||
<string>关闭影像</string>
|
<string>关闭影像</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_11">
|
<action name="mSetting">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>设置</string>
|
<string>设置</string>
|
||||||
</property>
|
</property>
|
||||||
|
|||||||
@ -108,6 +108,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="aboutWindow.cpp" />
|
<ClCompile Include="aboutWindow.cpp" />
|
||||||
<ClCompile Include="adjustTable.cpp" />
|
<ClCompile Include="adjustTable.cpp" />
|
||||||
|
<ClCompile Include="AppSettings.cpp" />
|
||||||
<ClCompile Include="AspectRatioLabel.cpp" />
|
<ClCompile Include="AspectRatioLabel.cpp" />
|
||||||
<ClCompile Include="CaptureCoordinator.cpp" />
|
<ClCompile Include="CaptureCoordinator.cpp" />
|
||||||
<ClCompile Include="Carousel.cpp" />
|
<ClCompile Include="Carousel.cpp" />
|
||||||
@ -145,6 +146,7 @@
|
|||||||
<ClCompile Include="ResononNirImager.cpp" />
|
<ClCompile Include="ResononNirImager.cpp" />
|
||||||
<ClCompile Include="RgbCameraOperation.cpp" />
|
<ClCompile Include="RgbCameraOperation.cpp" />
|
||||||
<ClCompile Include="RobotArmControl.cpp" />
|
<ClCompile Include="RobotArmControl.cpp" />
|
||||||
|
<ClCompile Include="setWindow.cpp" />
|
||||||
<ClCompile Include="stdafx.cpp">
|
<ClCompile Include="stdafx.cpp">
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||||
@ -178,6 +180,7 @@
|
|||||||
<QtUic Include="RadianceConversion.ui" />
|
<QtUic Include="RadianceConversion.ui" />
|
||||||
<QtUic Include="ReflectanceConversion.ui" />
|
<QtUic Include="ReflectanceConversion.ui" />
|
||||||
<QtUic Include="RobotArmControl.ui" />
|
<QtUic Include="RobotArmControl.ui" />
|
||||||
|
<QtUic Include="set.ui" />
|
||||||
<QtUic Include="twoMotorControl.ui" />
|
<QtUic Include="twoMotorControl.ui" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -202,6 +205,7 @@
|
|||||||
<QtMoc Include="imageControl.h" />
|
<QtMoc Include="imageControl.h" />
|
||||||
<QtMoc Include="AspectRatioLabel.h" />
|
<QtMoc Include="AspectRatioLabel.h" />
|
||||||
<QtMoc Include="HyperImagerControl.h" />
|
<QtMoc Include="HyperImagerControl.h" />
|
||||||
|
<ClInclude Include="AppSettings.h" />
|
||||||
<ClInclude Include="imager_base.h" />
|
<ClInclude Include="imager_base.h" />
|
||||||
<ClInclude Include="irisximeaimager.h" />
|
<ClInclude Include="irisximeaimager.h" />
|
||||||
<QtMoc Include="OneMotorControl.h" />
|
<QtMoc Include="OneMotorControl.h" />
|
||||||
@ -224,6 +228,7 @@
|
|||||||
<ClInclude Include="RasterDataProvider.h" />
|
<ClInclude Include="RasterDataProvider.h" />
|
||||||
<ClInclude Include="RasterRenderer.h" />
|
<ClInclude Include="RasterRenderer.h" />
|
||||||
<QtMoc Include="recordFrameCounter.h" />
|
<QtMoc Include="recordFrameCounter.h" />
|
||||||
|
<QtMoc Include="setWindow.h" />
|
||||||
<ClInclude Include="utility_tc.h" />
|
<ClInclude Include="utility_tc.h" />
|
||||||
<QtMoc Include="aboutWindow.h" />
|
<QtMoc Include="aboutWindow.h" />
|
||||||
<ClInclude Include="hppaConfigFile.h" />
|
<ClInclude Include="hppaConfigFile.h" />
|
||||||
|
|||||||
@ -199,6 +199,12 @@
|
|||||||
<ClCompile Include="recordFrameCounter.cpp">
|
<ClCompile Include="recordFrameCounter.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="setWindow.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="AppSettings.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<QtMoc Include="fileOperation.h">
|
<QtMoc Include="fileOperation.h">
|
||||||
@ -324,6 +330,9 @@
|
|||||||
<QtMoc Include="recordFrameCounter.h">
|
<QtMoc Include="recordFrameCounter.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
|
<QtMoc Include="setWindow.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</QtMoc>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="imageProcessor.h">
|
<ClInclude Include="imageProcessor.h">
|
||||||
@ -365,6 +374,9 @@
|
|||||||
<ClInclude Include="LayerTreeView.h">
|
<ClInclude Include="LayerTreeView.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="AppSettings.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<QtUic Include="FocusDialog.ui">
|
<QtUic Include="FocusDialog.ui">
|
||||||
@ -403,6 +415,9 @@
|
|||||||
<QtUic Include="hyperImagerControl.ui">
|
<QtUic Include="hyperImagerControl.ui">
|
||||||
<Filter>Form Files</Filter>
|
<Filter>Form Files</Filter>
|
||||||
</QtUic>
|
</QtUic>
|
||||||
|
<QtUic Include="set.ui">
|
||||||
|
<Filter>Form Files</Filter>
|
||||||
|
</QtUic>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="cpp.hint" />
|
<None Include="cpp.hint" />
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#include "ImagerOperationBase.h"
|
#include "ImagerOperationBase.h"
|
||||||
|
|
||||||
ImagerOperationBase::ImagerOperationBase()
|
ImagerOperationBase::ImagerOperationBase()
|
||||||
{
|
{
|
||||||
@ -44,11 +44,11 @@ void ImagerOperationBase::connect_imager(int frameNumber)
|
|||||||
|
|
||||||
double ImagerOperationBase::auto_exposure()
|
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);
|
setIntegrationTime(x);
|
||||||
|
|
||||||
//<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>Ѱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><EFBFBD>
|
//第二步:通过循环寻找最佳曝光时间
|
||||||
imagerStartCollect();
|
imagerStartCollect();
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
@ -57,7 +57,7 @@ double ImagerOperationBase::auto_exposure()
|
|||||||
if (GetMaxValue(buffer, m_FrameSize) >= 4094)
|
if (GetMaxValue(buffer, m_FrameSize) >= 4094)
|
||||||
{
|
{
|
||||||
setIntegrationTime(getIntegrationTime() * 0.95);
|
setIntegrationTime(getIntegrationTime() * 0.95);
|
||||||
std::cout << "<EFBFBD>Զ<EFBFBD><EFBFBD>ع<EFBFBD>-----------" << std::endl;
|
std::cout << "自动曝光-----------" << std::endl;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -69,7 +69,7 @@ double ImagerOperationBase::auto_exposure()
|
|||||||
|
|
||||||
emit autoExposureSignal();
|
emit autoExposureSignal();
|
||||||
|
|
||||||
//std::cout << "<EFBFBD>Զ<EFBFBD><EFBFBD>ع⣺" << getIntegrationTime() << std::endl;
|
//std::cout << "自动曝光:" << getIntegrationTime() << std::endl;
|
||||||
|
|
||||||
return getIntegrationTime();
|
return getIntegrationTime();
|
||||||
}
|
}
|
||||||
@ -79,7 +79,7 @@ void ImagerOperationBase::focus()
|
|||||||
m_iFocusFramesNumber = 0;
|
m_iFocusFramesNumber = 0;
|
||||||
|
|
||||||
m_iFocusFrameCounter = 1;
|
m_iFocusFrameCounter = 1;
|
||||||
//std::cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>-----------" << std::endl;
|
//std::cout << "调焦-----------" << std::endl;
|
||||||
|
|
||||||
double tmpFrmerate = getFramerate();
|
double tmpFrmerate = getFramerate();
|
||||||
double tmpIntegrationTime = getIntegrationTime();
|
double tmpIntegrationTime = getIntegrationTime();
|
||||||
@ -87,7 +87,7 @@ void ImagerOperationBase::focus()
|
|||||||
|
|
||||||
setFramerate(5);
|
setFramerate(5);
|
||||||
auto_exposure();
|
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;
|
int iWidth, iHeight;
|
||||||
GetFrameSize(iWidth, iHeight);
|
GetFrameSize(iWidth, iHeight);
|
||||||
@ -99,7 +99,7 @@ void ImagerOperationBase::focus()
|
|||||||
m_bFocusControlState = true;
|
m_bFocusControlState = true;
|
||||||
while (m_bFocusControlState)
|
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));
|
//memset((void*)buffer, 0, m_FrameSize * sizeof(unsigned short));
|
||||||
//int fn = 5;
|
//int fn = 5;
|
||||||
//for (int i = 0; i < fn; i++)
|
//for (int i = 0; i < fn; i++)
|
||||||
@ -123,7 +123,7 @@ void ImagerOperationBase::focus()
|
|||||||
|
|
||||||
double focusIndex = calcFocusIndexSobelPrivate(buffer);
|
double focusIndex = calcFocusIndexSobelPrivate(buffer);
|
||||||
emit FocusIndexSobelSignal(focusIndex);
|
emit FocusIndexSobelSignal(focusIndex);
|
||||||
std::cout << "focusIndex<EFBFBD><EFBFBD>" << focusIndex << std::endl;
|
std::cout << "focusIndex:" << focusIndex << std::endl;
|
||||||
|
|
||||||
emit SpectralSignal(1);
|
emit SpectralSignal(1);
|
||||||
|
|
||||||
@ -140,7 +140,7 @@ void ImagerOperationBase::focus()
|
|||||||
|
|
||||||
void ImagerOperationBase::record_dark()
|
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();
|
imagerStartCollect();
|
||||||
|
|
||||||
unsigned int* dark_tmp = new unsigned int[m_FrameSize];
|
unsigned int* dark_tmp = new unsigned int[m_FrameSize];
|
||||||
@ -172,7 +172,7 @@ void ImagerOperationBase::record_dark()
|
|||||||
|
|
||||||
void ImagerOperationBase::record_white()
|
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();
|
imagerStartCollect();
|
||||||
|
|
||||||
unsigned int* white_tmp = new unsigned int[m_FrameSize];
|
unsigned int* white_tmp = new unsigned int[m_FrameSize];
|
||||||
@ -197,7 +197,7 @@ void ImagerOperationBase::record_white()
|
|||||||
|
|
||||||
imagerStopCollect();
|
imagerStopCollect();
|
||||||
|
|
||||||
//<EFBFBD>װ<EFBFBD><EFBFBD>۰<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//白板扣暗电流
|
||||||
if (m_HasDark)
|
if (m_HasDark)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < m_FrameSize; i++)
|
for (size_t i = 0; i < m_FrameSize; i++)
|
||||||
@ -225,17 +225,17 @@ void ImagerOperationBase::start_record()
|
|||||||
//std::cout << "------------------------------------------------------" << std::endl;
|
//std::cout << "------------------------------------------------------" << std::endl;
|
||||||
|
|
||||||
m_iFrameCounter = 0;
|
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;
|
m_bRecordControlState = true;
|
||||||
|
|
||||||
//<EFBFBD>ж<EFBFBD><EFBFBD>ڴ<EFBFBD>buffer<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//判断内存buffer是否正常分配
|
||||||
if (buffer == 0)
|
if (buffer == 0)
|
||||||
{
|
{
|
||||||
std::cerr << "Error: memory could not be allocated for datacube";
|
std::cerr << "Error: memory could not be allocated for datacube";
|
||||||
exit(EXIT_FAILURE);
|
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
|
// prepare file name that will be used for saving
|
||||||
m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil";
|
m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil";
|
||||||
QString baseName = QString::fromStdString(getFileNameFromPath(m_FileName2Save2));
|
QString baseName = QString::fromStdString(getFileNameFromPath(m_FileName2Save2));
|
||||||
@ -258,7 +258,7 @@ void ImagerOperationBase::start_record()
|
|||||||
getFrame(buffer);
|
getFrame(buffer);
|
||||||
long long timeOs = getNanosecondsSinceMidnight();
|
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
|
//减去暗电流,应为buffer和dark都是unsigned short,所以当dark>buffer时,buffer-dark=65535
|
||||||
if (m_HasDark)
|
if (m_HasDark)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < m_FrameSize; i++)
|
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)
|
if (m_HasWhite)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < m_FrameSize; i++)
|
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)
|
if (white[i] != 0)
|
||||||
{
|
{
|
||||||
pixelValueTmp = buffer[i];
|
pixelValueTmp = buffer[i];
|
||||||
@ -299,12 +299,12 @@ void ImagerOperationBase::start_record()
|
|||||||
x = fwrite(buffer, 2, m_FrameSize, m_fImage);
|
x = fwrite(buffer, 2, m_FrameSize, m_fImage);
|
||||||
fprintf(hTimesFile, "%d\n", timeOs);
|
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);//??????????????????????????????????????????????????????????????????????????????????????????????????????
|
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)
|
if (m_iFrameCounter % (int)getFramerate() == 0)
|
||||||
{
|
{
|
||||||
emit PlotSignal(m_FileSavedCounter, m_iFrameCounter, filePath);
|
emit PlotSignal(m_FileSavedCounter, m_iFrameCounter, filePath);
|
||||||
@ -318,15 +318,15 @@ void ImagerOperationBase::start_record()
|
|||||||
}
|
}
|
||||||
imagerStopCollect();
|
imagerStopCollect();
|
||||||
|
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>λ<EFBFBD>ͼǰ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//在最后一次画图前需要进行一次拉伸
|
||||||
//m_RgbImage
|
//m_RgbImage
|
||||||
emit PlotSignal(m_FileSavedCounter, -1, filePath);
|
emit PlotSignal(m_FileSavedCounter, -1, filePath);
|
||||||
|
|
||||||
m_bRecordControlState = false;
|
m_bRecordControlState = false;
|
||||||
WriteHdr();
|
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>
|
// 发射 ImageFileSaved 信号,通知 UI 层把该文件加入图层管理器
|
||||||
// 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>
|
// m_FileName2Save2 保存了本次写入的 .bil 文件名(例如 "tmp_image_0.bil")
|
||||||
emit ImageFileSaved(QString::fromStdString(m_FileName2Save2), m_FileSavedCounter);
|
emit ImageFileSaved(QString::fromStdString(m_FileName2Save2), m_FileSavedCounter);
|
||||||
|
|
||||||
m_FileSavedCounter++;
|
m_FileSavedCounter++;
|
||||||
@ -397,7 +397,7 @@ double ImagerOperationBase::calcFocusIndexSobelPrivate(void* pvData)
|
|||||||
unsigned short* psData;
|
unsigned short* psData;
|
||||||
psData = (unsigned short*)pvData;
|
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 rgbFilePathNoStrech = "E:\\hppa\\delete\\focusImg_";
|
||||||
string tmp1 = std::to_string(m_iFocusFramesNumber);
|
string tmp1 = std::to_string(m_iFocusFramesNumber);
|
||||||
string tmp2 = ".png";*/
|
string tmp2 = ".png";*/
|
||||||
@ -407,7 +407,7 @@ double ImagerOperationBase::calcFocusIndexSobelPrivate(void* pvData)
|
|||||||
//cv::imwrite(rgbFilePathNoStrech, gray);
|
//cv::imwrite(rgbFilePathNoStrech, gray);
|
||||||
m_iFocusFramesNumber++;
|
m_iFocusFramesNumber++;
|
||||||
|
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
|
//进行滤波
|
||||||
//cv::Mat outputImage;
|
//cv::Mat outputImage;
|
||||||
//cv::Size kernelSize(5, 5);
|
//cv::Size kernelSize(5, 5);
|
||||||
//double sigmaX = 1.5;
|
//double sigmaX = 1.5;
|
||||||
@ -417,7 +417,7 @@ double ImagerOperationBase::calcFocusIndexSobelPrivate(void* pvData)
|
|||||||
|
|
||||||
cv::Mat gradX, gradY, absGradX, absGradY;
|
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::Sobel(outputImage, gradY, CV_32F, 0, 1);
|
||||||
cv::convertScaleAbs(gradX, absGradX);
|
cv::convertScaleAbs(gradX, absGradX);
|
||||||
cv::convertScaleAbs(gradY, absGradY);
|
cv::convertScaleAbs(gradY, absGradY);
|
||||||
@ -426,7 +426,7 @@ double ImagerOperationBase::calcFocusIndexSobelPrivate(void* pvData)
|
|||||||
|
|
||||||
cv::Mat magnitude, direction;
|
cv::Mat magnitude, direction;
|
||||||
cv::magnitude(gradX, gradY, magnitude);//
|
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];
|
return cv::mean(magnitude)[0];
|
||||||
@ -479,23 +479,23 @@ int ImagerOperationBase::getFocusFrameCounter() const
|
|||||||
|
|
||||||
void ImagerOperationBase::set_buffer()
|
void ImagerOperationBase::set_buffer()
|
||||||
{
|
{
|
||||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//如果
|
||||||
if (buffer != nullptr)
|
if (buffer != nullptr)
|
||||||
{
|
{
|
||||||
std::cout << "<EFBFBD>ͷŶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>" << std::endl;
|
std::cout << "释放堆上内存" << std::endl;
|
||||||
free(buffer);
|
free(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_FrameSize = getBandCount() * getSampleCount();
|
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];
|
buffer = new unsigned short[m_FrameSize];
|
||||||
dark = new unsigned short[m_FrameSize];
|
dark = new unsigned short[m_FrameSize];
|
||||||
white = new unsigned short[m_FrameSize];
|
white = new unsigned short[m_FrameSize];
|
||||||
|
|
||||||
std::cout << "buffer<EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ַ" << buffer << std::endl;
|
std::cout << "buffer内存地址" << buffer << std::endl;
|
||||||
std::cout << "dark<EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ַ" << dark << std::endl;
|
std::cout << "dark内存地址" << dark << std::endl;
|
||||||
std::cout << "white<EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ַ" << white << std::endl;
|
std::cout << "white内存地址" << white << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImagerOperationBase::WriteHdr()
|
void ImagerOperationBase::WriteHdr()
|
||||||
@ -540,6 +540,6 @@ unsigned short ImagerOperationBase::GetMaxValue(unsigned short* dark, int number
|
|||||||
max = dark[i];
|
max = dark[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//std::cout << "<EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ" << max << std::endl;
|
//std::cout << "本帧最大值为" << max << std::endl;
|
||||||
return max;
|
return max;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ public:
|
|||||||
int getFrameCounter() const;
|
int getFrameCounter() const;
|
||||||
int getFocusFrameCounter() 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 set_buffer();
|
||||||
void setFileName2Save(string FileName);
|
void setFileName2Save(string FileName);
|
||||||
|
|
||||||
@ -60,25 +60,25 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CImage* m_RgbImage;//<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>rgbͼ<EFBFBD><EFBFBD>
|
CImage* m_RgbImage;//显示的rgb图像
|
||||||
bool m_bRecordControlState;//<EFBFBD>ɼ<EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD>ֹͣ<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
bool m_bRecordControlState;//采集状态;可用于执行停止采集操作
|
||||||
int m_iFrameCounter;//<EFBFBD><EFBFBD>¼<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD>
|
int m_iFrameCounter;//记录采集的帧数
|
||||||
int m_iFocusFrameCounter;//<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD>
|
int m_iFocusFrameCounter;//记录调焦时采集的帧数
|
||||||
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_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>
|
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;
|
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_HasDark;//当采集了暗电流之后,设置为true
|
||||||
bool m_HasWhite;//<EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD>˰װ<EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊtrue
|
bool m_HasWhite;//当采集了白板之后,设置为true
|
||||||
|
|
||||||
unsigned short* dark;//<EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
unsigned short* dark;//存储暗电流
|
||||||
unsigned short* white;//<EFBFBD>洢<EFBFBD>װ<EFBFBD>
|
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);
|
double calcFocusIndexSobelPrivate(void* pvData);
|
||||||
|
|
||||||
public slots:
|
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 double auto_exposure();
|
||||||
virtual void focus();
|
virtual void focus();
|
||||||
virtual void start_record();
|
virtual void start_record();
|
||||||
@ -102,10 +102,10 @@ public slots:
|
|||||||
|
|
||||||
void getFocusIndexSobel();
|
void getFocusIndexSobel();
|
||||||
signals:
|
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 PlotSignal(int, int, QString);//绘制影像信号,第一个参数:第几个影像;第二个参数:采集到的帧数,-1代表此次采集的最后一次绘制
|
||||||
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_WhenFrameNumberMeet();//采集完成信号:需要采集的总帧数(m_iFrameNumber)采集完成
|
||||||
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 RecordFinishedSignal_WhenFrameNumberNotMeet();//采集完成信号:需要采集的总帧数(m_iFrameNumber)没有采集完成,中途停止采集
|
||||||
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 SpectralSignal(int);//发射1代表正在调焦,绘制光谱,发射0表示调焦完成;
|
||||||
|
|
||||||
void RecordWhiteFinishSignal();
|
void RecordWhiteFinishSignal();
|
||||||
void RecordDarlFinishSignal();
|
void RecordDarlFinishSignal();
|
||||||
@ -113,12 +113,12 @@ signals:
|
|||||||
void FocusIndexSobelSignal(double);
|
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();
|
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);
|
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);
|
void LayerFileCreated(const QString& baseName, const QString& filePath, int fileIndex);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "fileOperation.h"
|
#include "fileOperation.h"
|
||||||
|
#include "AppSettings.h"
|
||||||
|
|
||||||
FileOperation::FileOperation()
|
FileOperation::FileOperation()
|
||||||
{
|
{
|
||||||
@ -27,6 +28,11 @@ string FileOperation::getDirectoryOfExe()
|
|||||||
|
|
||||||
string FileOperation::getDirectoryFromString(string directory)
|
string FileOperation::getDirectoryFromString(string directory)
|
||||||
{
|
{
|
||||||
|
if (directory.empty())
|
||||||
|
{
|
||||||
|
directory = AppSettings::instance().dataFolder().toStdString();
|
||||||
|
}
|
||||||
|
|
||||||
QString tmp = QString::fromStdString(directory);
|
QString tmp = QString::fromStdString(directory);
|
||||||
QDir dir;
|
QDir dir;
|
||||||
if (!dir.exists(tmp))
|
if (!dir.exists(tmp))
|
||||||
|
|||||||
@ -17,7 +17,7 @@ public:
|
|||||||
~FileOperation();
|
~FileOperation();
|
||||||
|
|
||||||
string getDirectoryOfExe();//getDirectoryOfExe
|
string getDirectoryOfExe();//getDirectoryOfExe
|
||||||
string getDirectoryFromString(string directory="C:\\HPPA_image");
|
string getDirectoryFromString(string directory="");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
267
HPPA/set.ui
Normal file
267
HPPA/set.ui
Normal 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 "新宋体";
|
||||||
|
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 "新宋体";
|
||||||
|
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
49
HPPA/setWindow.cpp
Normal 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
27
HPPA/setWindow.h
Normal 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:
|
||||||
|
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user