add,计划采集16:
解决切换相机时的图片不切换问题 解决设置高光谱相机帧率和积分时间失效问题 拷贝航线路径文件到数据文件夹 单反弹窗报错:添加描述 图像控制添加2%拉伸
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@ -9,6 +9,7 @@ icon
|
||||
ignore_*
|
||||
resources
|
||||
*.bkp
|
||||
.qwen
|
||||
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
@ -632,6 +632,7 @@ void HPPA::setTimedDataCollectionHyperCamParm(int camType, double f, double e, Q
|
||||
{
|
||||
disconnectImagerAndCleanup();
|
||||
ui.mActionPica_L->setChecked(true);
|
||||
selectingImager(ui.mActionPica_L);
|
||||
|
||||
AppSettings::instance().setFrameRate(f);
|
||||
AppSettings::instance().setIntegrationTime(e);
|
||||
@ -647,6 +648,7 @@ void HPPA::setTimedDataCollectionHyperCamParm(int camType, double f, double e, Q
|
||||
{
|
||||
disconnectImagerAndCleanup();
|
||||
ui.mActionPica_NIR->setChecked(true);
|
||||
selectingImager(ui.mActionPica_NIR);
|
||||
|
||||
AppSettings::instance().setFrameRate(f);
|
||||
AppSettings::instance().setIntegrationTime(e);
|
||||
@ -667,10 +669,6 @@ void HPPA::setTimedDataCollectionCamParm(int camType, int captureIntervalSeconds
|
||||
{
|
||||
case 2:
|
||||
{
|
||||
//唤醒单反相机
|
||||
m_pc3D->slrPowerDown();
|
||||
m_pc3D->slrPowerOn();
|
||||
|
||||
m_singleLensReflexCameraWindow->setDataFolder(folder);
|
||||
m_singleLensReflexCameraWindow->setCaptureInterval(captureIntervalSeconds);
|
||||
|
||||
@ -678,8 +676,6 @@ void HPPA::setTimedDataCollectionCamParm(int camType, int captureIntervalSeconds
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
m_pc3D->d65LampPowerOn();
|
||||
|
||||
m_depthCameraWindow->setDataFolder(folder);
|
||||
m_depthCameraWindow->setCaptureInterval(captureIntervalSeconds);
|
||||
|
||||
@ -2388,9 +2384,9 @@ void HPPA::onconnect()
|
||||
ui.gain_lineEdit->setValidator(new QRegExpValidator(rx));*/
|
||||
|
||||
//获取相机参数并显示到界面中
|
||||
m_hic->setFrameRate(AppSettings::instance().frameRate());
|
||||
m_hic->setIntegrationTime(AppSettings::instance().integrationTime());
|
||||
m_hic->setGain(AppSettings::instance().gain());
|
||||
onFramerateChanged(AppSettings::instance().frameRate());
|
||||
onIntegrationTimeChanged(AppSettings::instance().integrationTime());
|
||||
onGainChanged(AppSettings::instance().gain());
|
||||
}
|
||||
catch (std::exception const& e)
|
||||
{
|
||||
@ -2619,8 +2615,8 @@ void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber, QSt
|
||||
m_recordFrameCounter->updateFrameCount(static_cast<RasterLayer*>(mapLayer), m_Imager->getFrameCounter());
|
||||
}
|
||||
|
||||
if (ui.mAction3DPlantPhenotypeScenario->isChecked())
|
||||
return;
|
||||
//if (ui.mAction3DPlantPhenotypeScenario->isChecked())
|
||||
// return;
|
||||
|
||||
//return;
|
||||
//获取绘图控件
|
||||
@ -2813,7 +2809,8 @@ void HPPA::onLayerCreatedFromFile(const QString& baseName, const QString& filePa
|
||||
|
||||
if (ui.mAction3DPlantPhenotypeScenario->isChecked())
|
||||
{
|
||||
addLayer(baseName, filePath, false, false);
|
||||
//addLayer(baseName, filePath, false, false);
|
||||
addLayer(baseName, filePath, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
#include "RasterDataProvider.h"
|
||||
#include <QDebug>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
|
||||
MultibandRasterRenderer::MultibandRasterRenderer(RasterDataProvider* provider)
|
||||
: RasterRendererBase(provider)
|
||||
@ -26,6 +27,96 @@ void MultibandRasterRenderer::stretchTo8bit(const std::vector<float>& in, std::v
|
||||
}
|
||||
}
|
||||
|
||||
void MultibandRasterRenderer::computeHistogram(const std::vector<float>& in, std::vector<long>& hist, float& minVal, float& maxVal)
|
||||
{
|
||||
if (in.empty())
|
||||
{
|
||||
minVal = 0.0f;
|
||||
maxVal = 1.0f;
|
||||
hist.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
minVal = in[0];
|
||||
maxVal = in[0];
|
||||
for (size_t i = 0; i < in.size(); ++i)
|
||||
{
|
||||
if (in[i] < minVal) minVal = in[i];
|
||||
if (in[i] > maxVal) maxVal = in[i];
|
||||
}
|
||||
|
||||
if (maxVal <= minVal)
|
||||
{
|
||||
hist.assign(256, 0);
|
||||
hist[0] = static_cast<long>(in.size());
|
||||
minVal = 0.0f;
|
||||
maxVal = 1.0f;
|
||||
return;
|
||||
}
|
||||
|
||||
const int numBins = 65536;
|
||||
hist.assign(numBins, 0);
|
||||
|
||||
for (size_t i = 0; i < in.size(); ++i)
|
||||
{
|
||||
++hist[static_cast<int>(in[i])];
|
||||
}
|
||||
}
|
||||
|
||||
void MultibandRasterRenderer::findStretchValuesByRatio(const std::vector<long>& hist, float ratio, float& minVal, float& maxVal)
|
||||
{
|
||||
if (hist.empty()) return;
|
||||
|
||||
long totalPixels = 0;
|
||||
for (size_t i = 0; i < hist.size(); ++i)
|
||||
{
|
||||
totalPixels += hist[i];
|
||||
}
|
||||
if (totalPixels == 0) return;
|
||||
|
||||
long targetCount = static_cast<long>(totalPixels * ratio);
|
||||
|
||||
long cumulative = 0;
|
||||
for (size_t i = 0; i < hist.size(); ++i)
|
||||
{
|
||||
cumulative += hist[i];
|
||||
if (cumulative >= targetCount)
|
||||
{
|
||||
minVal = static_cast<float>(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cumulative = 0;
|
||||
for (size_t i = hist.size(); i > 0; --i)
|
||||
{
|
||||
cumulative += hist[i - 1];
|
||||
if (cumulative >= targetCount)
|
||||
{
|
||||
maxVal = static_cast<float>(i - 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MultibandRasterRenderer::stretchTo8bitByHistogram(const std::vector<float>& in, std::vector<unsigned char>& out, float minVal, float maxVal)
|
||||
{
|
||||
size_t n = in.size();
|
||||
out.resize(n);
|
||||
if (maxVal <= minVal)
|
||||
{
|
||||
std::fill(out.begin(), out.end(), 0);
|
||||
return;
|
||||
}
|
||||
float denom = 1.0f / (maxVal - minVal);
|
||||
for (size_t i = 0; i < n; ++i)
|
||||
{
|
||||
float v = (in[i] - minVal) * denom;
|
||||
v = std::min(std::max(v, 0.0f), 1.0f);
|
||||
out[i] = static_cast<unsigned char>(v * 255.0f);
|
||||
}
|
||||
}
|
||||
|
||||
QImage MultibandRasterRenderer::render()
|
||||
{
|
||||
if (!m_provider) return QImage();
|
||||
@ -65,11 +156,39 @@ QImage MultibandRasterRenderer::render()
|
||||
if (bIdx >= 0) m_provider->readBandAsFloat(bIdx, bbuf);
|
||||
|
||||
std::vector<unsigned char> r8, g8, b8;
|
||||
float minV = static_cast<float>(m_params.minValue);
|
||||
float maxV = static_cast<float>(m_params.maxValue);
|
||||
if (!rbuf.empty()) stretchTo8bit(rbuf, r8, minV, maxV);
|
||||
if (!gbuf.empty()) stretchTo8bit(gbuf, g8, minV, maxV);
|
||||
if (!bbuf.empty()) stretchTo8bit(bbuf, b8, minV, maxV);
|
||||
|
||||
// Compute histogram-based stretch for each channel
|
||||
float ratio = m_stretchRatio;
|
||||
|
||||
// R channel stretch
|
||||
if (!rbuf.empty()) {
|
||||
std::vector<long> rHist;
|
||||
float rMin, rMax;
|
||||
computeHistogram(rbuf, rHist, rMin, rMax);
|
||||
float rStretchMin = rMin, rStretchMax = rMax;
|
||||
findStretchValuesByRatio(rHist, ratio, rStretchMin, rStretchMax);
|
||||
stretchTo8bitByHistogram(rbuf, r8, rStretchMin, rStretchMax);
|
||||
}
|
||||
|
||||
// G channel stretch
|
||||
if (!gbuf.empty()) {
|
||||
std::vector<long> gHist;
|
||||
float gMin, gMax;
|
||||
computeHistogram(gbuf, gHist, gMin, gMax);
|
||||
float gStretchMin = gMin, gStretchMax = gMax;
|
||||
findStretchValuesByRatio(gHist, ratio, gStretchMin, gStretchMax);
|
||||
stretchTo8bitByHistogram(gbuf, g8, gStretchMin, gStretchMax);
|
||||
}
|
||||
|
||||
// B channel stretch
|
||||
if (!bbuf.empty()) {
|
||||
std::vector<long> bHist;
|
||||
float bMin, bMax;
|
||||
computeHistogram(bbuf, bHist, bMin, bMax);
|
||||
float bStretchMin = bMin, bStretchMax = bMax;
|
||||
findStretchValuesByRatio(bHist, ratio, bStretchMin, bStretchMax);
|
||||
stretchTo8bitByHistogram(bbuf, b8, bStretchMin, bStretchMax);
|
||||
}
|
||||
|
||||
QImage out(w, h, QImage::Format_RGB888);
|
||||
for (int y = 0; y < h; ++y) {
|
||||
|
||||
@ -18,9 +18,22 @@ public:
|
||||
MultibandRenderParams params() const { return m_params; }
|
||||
void setParams(const MultibandRenderParams& params) { m_params = params; }
|
||||
|
||||
void setStretchRatio(float ratio) { m_stretchRatio = ratio; }
|
||||
float stretchRatio() const { return m_stretchRatio; }
|
||||
|
||||
private:
|
||||
MultibandRenderParams m_params;
|
||||
float m_stretchRatio = 0.02f;
|
||||
|
||||
// Helper to map float buffer to 8-bit with min/max stretch
|
||||
static void stretchTo8bit(const std::vector<float>& in, std::vector<unsigned char>& out, float minVal, float maxVal);
|
||||
|
||||
// Helper to compute histogram from float buffer
|
||||
static void computeHistogram(const std::vector<float>& in, std::vector<long>& hist, float& minVal, float& maxVal);
|
||||
|
||||
// Helper to find stretch values by cumulative histogram ratio
|
||||
static void findStretchValuesByRatio(const std::vector<long>& hist, float ratio, float& minVal, float& maxVal);
|
||||
|
||||
// Helper to stretch to 8-bit using histogram-based stretch
|
||||
static void stretchTo8bitByHistogram(const std::vector<float>& in, std::vector<unsigned char>& out, float minVal, float maxVal);
|
||||
};
|
||||
|
||||
@ -6,6 +6,124 @@
|
||||
// 全局变量用于回调函数访问
|
||||
static SingleLensReflexCameraOperation* g_cameraOperation = nullptr;
|
||||
|
||||
// 将Canon EDSDK错误码转换为中文描述
|
||||
QString getEDSDKErrorMessage(EdsError err)
|
||||
{
|
||||
switch (err)
|
||||
{
|
||||
case EDS_ERR_OK:
|
||||
return QString::fromLocal8Bit("操作成功,错误码:%1").arg(err);
|
||||
case EDS_ERR_UNIMPLEMENTED:
|
||||
return QString::fromLocal8Bit("功能未实现,错误码:%1").arg(err);
|
||||
case EDS_ERR_INTERNAL_ERROR:
|
||||
return QString::fromLocal8Bit("内部错误,错误码:%1").arg(err);
|
||||
case EDS_ERR_MEM_ALLOC_FAILED:
|
||||
return QString::fromLocal8Bit("内存分配失败,错误码:%1").arg(err);
|
||||
case EDS_ERR_MEM_FREE_FAILED:
|
||||
return QString::fromLocal8Bit("内存释放失败,错误码:%1").arg(err);
|
||||
case EDS_ERR_OPERATION_CANCELLED:
|
||||
return QString::fromLocal8Bit("操作已取消,错误码:%1").arg(err);
|
||||
case EDS_ERR_INCOMPATIBLE_VERSION:
|
||||
return QString::fromLocal8Bit("版本不兼容,错误码:%1").arg(err);
|
||||
case EDS_ERR_NOT_SUPPORTED:
|
||||
return QString::fromLocal8Bit("不支持该操作,错误码:%1").arg(err);
|
||||
case EDS_ERR_UNEXPECTED_EXCEPTION:
|
||||
return QString::fromLocal8Bit("意外异常,错误码:%1").arg(err);
|
||||
case EDS_ERR_PROTECTION_VIOLATION:
|
||||
return QString::fromLocal8Bit("保护违规,错误码:%1").arg(err);
|
||||
case EDS_ERR_MISSING_SUBCOMPONENT:
|
||||
return QString::fromLocal8Bit("缺少子组件,错误码:%1").arg(err);
|
||||
case EDS_ERR_SELECTION_UNAVAILABLE:
|
||||
return QString::fromLocal8Bit("选择不可用,错误码:%1").arg(err);
|
||||
case EDS_ERR_FILE_IO_ERROR:
|
||||
return QString::fromLocal8Bit("文件IO错误,错误码:%1").arg(err);
|
||||
case EDS_ERR_FILE_NOT_FOUND:
|
||||
return QString::fromLocal8Bit("文件未找到,错误码:%1").arg(err);
|
||||
case EDS_ERR_FILE_OPEN_ERROR:
|
||||
return QString::fromLocal8Bit("文件打开失败,错误码:%1").arg(err);
|
||||
case EDS_ERR_DEVICE_NOT_FOUND:
|
||||
return QString::fromLocal8Bit("设备未找到,错误码:%1").arg(err);
|
||||
case EDS_ERR_DEVICE_BUSY:
|
||||
return QString::fromLocal8Bit("设备忙,错误码:%1").arg(err);
|
||||
case EDS_ERR_DEVICE_INVALID:
|
||||
return QString::fromLocal8Bit("设备无效,错误码:%1").arg(err);
|
||||
case EDS_ERR_DEVICE_MEMORY_FULL:
|
||||
return QString::fromLocal8Bit("设备内存已满,错误码:%1").arg(err);
|
||||
case EDS_ERR_DEVICE_INTERNAL_ERROR:
|
||||
return QString::fromLocal8Bit("设备内部错误,错误码:%1").arg(err);
|
||||
case EDS_ERR_DEVICE_NO_DISK:
|
||||
return QString::fromLocal8Bit("设备无存储介质,错误码:%1").arg(err);
|
||||
case EDS_ERR_DEVICE_DISK_ERROR:
|
||||
return QString::fromLocal8Bit("设备磁盘错误,错误码:%1").arg(err);
|
||||
case EDS_ERR_DEVICE_CF_GATE_CHANGED:
|
||||
return QString::fromLocal8Bit("CF卡仓已改变,错误码:%1").arg(err);
|
||||
case EDS_ERR_DEVICE_DIAL_CHANGED:
|
||||
return QString::fromLocal8Bit("拨盘已改变,错误码:%1").arg(err);
|
||||
case EDS_ERR_DEVICE_NOT_INSTALLED:
|
||||
return QString::fromLocal8Bit("设备未安装,错误码:%1").arg(err);
|
||||
case EDS_ERR_SESSION_NOT_OPEN:
|
||||
return QString::fromLocal8Bit("会话未打开,错误码:%1").arg(err);
|
||||
case EDS_ERR_INVALID_TRANSACTIONID:
|
||||
return QString::fromLocal8Bit("无效的事务ID,错误码:%1").arg(err);
|
||||
case EDS_ERR_INCOMPLETE_TRANSFER:
|
||||
return QString::fromLocal8Bit("传输不完整,错误码:%1").arg(err);
|
||||
case EDS_ERR_INVALID_STRAGEID:
|
||||
return QString::fromLocal8Bit("无效的存储ID,错误码:%1").arg(err);
|
||||
case EDS_ERR_DEVICEPROP_NOT_SUPPORTED:
|
||||
return QString::fromLocal8Bit("设备属性不支持,错误码:%1").arg(err);
|
||||
case EDS_ERR_INVALID_OBJECTFORMATCODE:
|
||||
return QString::fromLocal8Bit("无效的对象格式代码,错误码:%1").arg(err);
|
||||
case EDS_ERR_SELF_TEST_FAILED:
|
||||
return QString::fromLocal8Bit("自检失败,错误码:%1").arg(err);
|
||||
case EDS_ERR_UNKNOWN_VENDOR_CODE:
|
||||
return QString::fromLocal8Bit("未知的厂商代码,错误码:%1").arg(err);
|
||||
case EDS_ERR_CAPTURE_ALREADY_TERMINATED:
|
||||
return QString::fromLocal8Bit("拍摄已终止,错误码:%1").arg(err);
|
||||
case EDS_ERR_PTP_DEVICE_BUSY:
|
||||
return QString::fromLocal8Bit("PTP设备忙,错误码:%1").arg(err);
|
||||
case EDS_ERR_UNKNOWN_COMMAND:
|
||||
return QString::fromLocal8Bit("未知命令,错误码:%1").arg(err);
|
||||
case EDS_ERR_OPERATION_REFUSED:
|
||||
return QString::fromLocal8Bit("操作被拒绝,错误码:%1").arg(err);
|
||||
case EDS_ERR_LENS_COVER_CLOSE:
|
||||
return QString::fromLocal8Bit("镜头盖未关闭,错误码:%1").arg(err);
|
||||
case EDS_ERR_LOW_BATTERY:
|
||||
return QString::fromLocal8Bit("电池电量低,错误码:%1").arg(err);
|
||||
case EDS_ERR_OBJECT_NOTREADY:
|
||||
return QString::fromLocal8Bit("对象未就绪,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_AF_NG:
|
||||
return QString::fromLocal8Bit("自动对焦失败,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_MIRROR_UP_NG:
|
||||
return QString::fromLocal8Bit("反光镜升起失败,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_SENSOR_CLEANING_NG:
|
||||
return QString::fromLocal8Bit("传感器清洁失败,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_SILENCE_NG:
|
||||
return QString::fromLocal8Bit("静音拍摄失败,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_NO_CARD_NG:
|
||||
return QString::fromLocal8Bit("未检测到存储卡,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_CARD_NG:
|
||||
return QString::fromLocal8Bit("存储卡错误,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG:
|
||||
return QString::fromLocal8Bit("存储卡被保护,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_MOVIE_CROP_NG:
|
||||
return QString::fromLocal8Bit("短片裁切模式不支持,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_STROBO_CHARGE_NG:
|
||||
return QString::fromLocal8Bit("闪光灯充电失败,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_NO_LENS_NG:
|
||||
return QString::fromLocal8Bit("未安装镜头,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_SPECIAL_MOVIE_MODE_NG:
|
||||
return QString::fromLocal8Bit("特殊短片模式不支持,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_LV_REL_PROHIBIT_MODE_NG:
|
||||
return QString::fromLocal8Bit("实时显示释放被禁止,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_MOVIE_MODE_NG:
|
||||
return QString::fromLocal8Bit("短片模式下不支持,错误码:%1").arg(err);
|
||||
case EDS_ERR_TAKE_PICTURE_RETRUCTED_LENS_NG:
|
||||
return QString::fromLocal8Bit("伸缩镜头不支持,错误码:%1").arg(err);
|
||||
default:
|
||||
return QString::fromLocal8Bit("未知错误: 0x%1").arg(err, 8, 16, QChar('0'));
|
||||
}
|
||||
}
|
||||
|
||||
SingleLensReflexCameraWindow::SingleLensReflexCameraWindow(QWidget* parent)
|
||||
: QDialog(parent)
|
||||
, m_isCapturing(false)
|
||||
@ -192,7 +310,7 @@ void SingleLensReflexCameraWindow::onImageCaptured(const QString& filePath)
|
||||
|
||||
void SingleLensReflexCameraWindow::onError(const QString& errorMsg)
|
||||
{
|
||||
QMessageBox::warning(this, QString::fromLocal8Bit("相机错误"), errorMsg);
|
||||
QMessageBox::warning(this, QString::fromLocal8Bit("单反相机错误"), errorMsg);
|
||||
}
|
||||
|
||||
void SingleLensReflexCameraWindow::onStartCapture()
|
||||
@ -764,7 +882,7 @@ void SingleLensReflexCameraOperation::OpenSLRCamera()
|
||||
err = initializeSDK();
|
||||
if (err != EDS_ERR_OK)
|
||||
{
|
||||
emit ErrorSignal(QString::fromLocal8Bit("初始化SDK失败,错误码: %1").arg(err));
|
||||
emit ErrorSignal(QString::fromLocal8Bit("初始化SDK失败: %1").arg(getEDSDKErrorMessage(err)));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -773,7 +891,7 @@ void SingleLensReflexCameraOperation::OpenSLRCamera()
|
||||
if (err != EDS_ERR_OK)
|
||||
{
|
||||
terminateSDK();
|
||||
emit ErrorSignal(QString::fromLocal8Bit("打开相机失败,错误码: %1").arg(err));
|
||||
emit ErrorSignal(QString::fromLocal8Bit("打开相机失败: %1").arg(getEDSDKErrorMessage(err)));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -783,7 +901,7 @@ void SingleLensReflexCameraOperation::OpenSLRCamera()
|
||||
{
|
||||
closeCamera();
|
||||
terminateSDK();
|
||||
emit ErrorSignal(QString::fromLocal8Bit("设置保存位置失败,错误码: %1").arg(err));
|
||||
emit ErrorSignal(QString::fromLocal8Bit("设置保存位置失败: %1").arg(getEDSDKErrorMessage(err)));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -829,7 +947,7 @@ void SingleLensReflexCameraOperation::OpenAndTakePhotoSLRCamera()
|
||||
err = initializeSDK();
|
||||
if (err != EDS_ERR_OK)
|
||||
{
|
||||
emit ErrorSignal(QString::fromLocal8Bit("初始化SDK失败,错误码: %1").arg(err));
|
||||
emit ErrorSignal(QString::fromLocal8Bit("初始化SDK失败: %1").arg(getEDSDKErrorMessage(err)));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -838,7 +956,7 @@ void SingleLensReflexCameraOperation::OpenAndTakePhotoSLRCamera()
|
||||
if (err != EDS_ERR_OK)
|
||||
{
|
||||
terminateSDK();
|
||||
emit ErrorSignal(QString::fromLocal8Bit("打开相机失败,错误码: %1").arg(err));
|
||||
emit ErrorSignal(QString::fromLocal8Bit("打开相机失败: %1").arg(getEDSDKErrorMessage(err)));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -848,7 +966,7 @@ void SingleLensReflexCameraOperation::OpenAndTakePhotoSLRCamera()
|
||||
{
|
||||
closeCamera();
|
||||
terminateSDK();
|
||||
emit ErrorSignal(QString::fromLocal8Bit("设置保存位置失败,错误码: %1").arg(err));
|
||||
emit ErrorSignal(QString::fromLocal8Bit("设置保存位置失败: %1").arg(getEDSDKErrorMessage(err)));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -934,7 +1052,7 @@ void SingleLensReflexCameraOperation::onCaptureTimer()
|
||||
// 如果是设备忙,不发送错误信号,等待下次重试
|
||||
if (err != EDS_ERR_DEVICE_BUSY)
|
||||
{
|
||||
emit ErrorSignal(QString::fromLocal8Bit("拍照失败,错误码: %1").arg(err));
|
||||
emit ErrorSignal(QString::fromLocal8Bit("拍照失败: %1").arg(getEDSDKErrorMessage(err)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -478,6 +478,12 @@ void TimedDataCollection::startScheduler()
|
||||
void TimedDataCollection::stopScheduler()
|
||||
{
|
||||
if (m_scheduler) {
|
||||
|
||||
for (size_t i = 0; i < m_taskModel->tasks().size(); i++)
|
||||
{
|
||||
m_taskModel->setTaskAndSubtaskStatus(m_taskModel->tasks()[i].id, TaskStatus::default);
|
||||
}
|
||||
|
||||
m_scheduler->stop();
|
||||
|
||||
m_currentTaskId = -1;
|
||||
|
||||
@ -3,6 +3,8 @@
|
||||
#include <QJsonObject>
|
||||
#include <QJsonArray>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
#include <QDir>
|
||||
#include <QTextStream>
|
||||
#include <QDebug>
|
||||
#include <algorithm>
|
||||
@ -299,6 +301,17 @@ void TaskExecutor::onSequenceComplete(int status)
|
||||
subTask.durationMinutes = (double)subTask.startTime.secsTo(subTask.endTime) / 60;
|
||||
qDebug() << "TaskExecutor: subtask "<< m_currentSubTaskIndex<< " time consuming(Minutes): "<< subTask.durationMinutes;
|
||||
|
||||
// 拷贝subTask.pathLineFilePath到m_currentFolder
|
||||
if (!subTask.pathLineFilePath.isEmpty() && QFile::exists(subTask.pathLineFilePath)) {
|
||||
QFileInfo fileInfo(subTask.pathLineFilePath);
|
||||
QString destPath = m_currentFolder + QDir::separator() + fileInfo.fileName();
|
||||
if (QFile::copy(subTask.pathLineFilePath, destPath)) {
|
||||
qDebug() << "TaskExecutor: Copied path line file to" << destPath;
|
||||
} else {
|
||||
qDebug() << "TaskExecutor: Failed to copy path line file from" << subTask.pathLineFilePath << "to" << destPath;
|
||||
}
|
||||
}
|
||||
|
||||
emit subTaskFinished(m_currentSubTaskIndex, subTask.type, (status == 0));
|
||||
emit taskUpdated(m_task);
|
||||
}
|
||||
@ -417,21 +430,24 @@ void TaskExecutor::executeNextSubTask()
|
||||
case SubTaskType::HyperSpectual400_1000nm:
|
||||
{
|
||||
camType = 0;
|
||||
emit hyperCamParm(camType, subTask.frameRate, subTask.exposureTime, makeSubTaskDataFolder("L"), "test");
|
||||
m_currentFolder = makeSubTaskDataFolder("L");
|
||||
emit hyperCamParm(camType, subTask.frameRate, subTask.exposureTime, m_currentFolder, "L");
|
||||
|
||||
break;
|
||||
}
|
||||
case SubTaskType::HyperSpectual1000_1700nm:
|
||||
{
|
||||
camType = 1;
|
||||
emit hyperCamParm(camType, subTask.frameRate, subTask.exposureTime, makeSubTaskDataFolder("NIR"), "test");
|
||||
m_currentFolder = makeSubTaskDataFolder("NIR");
|
||||
emit hyperCamParm(camType, subTask.frameRate, subTask.exposureTime, m_currentFolder, "NIR");
|
||||
|
||||
break;
|
||||
}
|
||||
case SubTaskType::SingleLensReflex:
|
||||
{
|
||||
camType = 2;
|
||||
emit camParm(camType, 3, makeSubTaskDataFolder("SLR"));
|
||||
m_currentFolder = makeSubTaskDataFolder("SLR");
|
||||
emit camParm(camType, 3, m_currentFolder);
|
||||
|
||||
emit switchD65LampSignal(1);
|
||||
|
||||
@ -443,7 +459,8 @@ void TaskExecutor::executeNextSubTask()
|
||||
case SubTaskType::DepthCamera:
|
||||
{
|
||||
camType = 3;
|
||||
emit camParm(camType, 3, makeSubTaskDataFolder("DepthCamera"));
|
||||
m_currentFolder = makeSubTaskDataFolder("DepthCamera");
|
||||
emit camParm(camType, 3, m_currentFolder);
|
||||
|
||||
emit switchD65LampSignal(1);
|
||||
|
||||
|
||||
@ -161,6 +161,7 @@ public slots:
|
||||
void onError(const QString& error);
|
||||
|
||||
private:
|
||||
QString m_currentFolder;
|
||||
void executeNextSubTask();
|
||||
|
||||
void printMsgAndTime(QString msg);
|
||||
|
||||
@ -62,7 +62,7 @@
|
||||
<item row="4" column="0" colspan="3">
|
||||
<widget class="QLabel" name="statusLabel">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
<string>任务统计</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
|
||||
Reference in New Issue
Block a user