From 2c0462b3fa702d32d2084a87b0f802ab8f07bfb3 Mon Sep 17 00:00:00 2001 From: tangchao Date: Fri, 29 Apr 2022 17:10:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A=20=EF=BC=881?= =?UTF-8?q?=EF=BC=89=E5=9F=BA=E4=BA=8E=E9=9D=9E=E7=BA=BF=E6=80=A7=E6=A0=A1?= =?UTF-8?q?=E6=AD=A3=E7=9A=84=E6=95=B0=E6=8D=AE=20=20=E7=94=9F=E6=88=90=20?= =?UTF-8?q?=20=E5=AE=9A=E6=A0=87=E6=96=87=E4=BB=B6=EF=BC=9B=20=EF=BC=882?= =?UTF-8?q?=EF=BC=89=E5=B0=86=E9=9D=9E=E7=BA=BF=E6=80=A7=E5=AE=9A=E6=A0=87?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=86=99=E5=88=B0=E6=96=87=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E7=BB=99=E5=8D=93=E5=93=A5=E7=94=A8=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Header_Files/oceanOpticsFiberImager.h | 10 ++- .../Source_Files/ATPControl_Serial_QT.cpp | 23 ++++-- .../Source_Files/atpFiberImager.cpp | 2 +- .../calibration_console/Source_Files/main.cpp | 73 +++++++++---------- .../Source_Files/oceanOpticsFiberImager.cpp | 42 ++++++++--- 5 files changed, 94 insertions(+), 56 deletions(-) diff --git a/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h b/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h index 135ce4a..786e0f5 100644 --- a/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h +++ b/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h @@ -14,7 +14,7 @@ class OceanOpticsFiberImager :public QObject,public FiberSpectrometerOperationBa Q_OBJECT public: - OceanOpticsFiberImager(); + OceanOpticsFiberImager(double * nonlinearityCoeffs, int numberOfCoeffs); ~OceanOpticsFiberImager(); OceanOptics_lib * m_FiberSpectrometer; @@ -35,11 +35,17 @@ public: ZZ_S32 GetMaxValue(ZZ_S32 * dark, int number); + //保存获取的仪器信息,不用每次都获取,这样程序更快 + DeviceInfo m_deviceInfo; + DeviceAttribute m_deviceAttribute; + // DataFrame m_IntegratingSphereData; // DataFrame m_DarkData; protected: private: - + double * m_nonlinearityCoeffs; + int m_iNumberOfNonlinearityCoeffs; + // ZZ_U32 m_MaxValueOfFiberSpectrometer; public slots: diff --git a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp index 8fb5e8d..9fbda54 100644 --- a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp +++ b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp @@ -512,7 +512,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM double fLastExposureTime = 0.1; int iRepeatCount = 0; - int iRes = SetExposureTime(2000);//need change to load from files + int iRes = SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS);//need change to load from files if (iRes != 0) { qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1"; @@ -527,16 +527,20 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM { bFlagIsAutoExposureFailed = true; bFlagIsOverTrying = true; + qDebug() << "大于30次"<= iDeviceDepth * 0.99) { @@ -566,6 +572,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM else if (iDeviceDepth * fMaxScaleFactor >= dTemp && dTemp >= iDeviceDepth * fMinScaleFactor) { bFlagIsAutoExposureOK = 1; + continue; } else if (dTemp > iDeviceDepth * fMaxScaleFactor) { @@ -592,12 +599,15 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM dFactor = dTemp / (iDeviceDepth * fMaxScaleFactor); fExposureTime = (float)(fExposureTime / dFactor); } - if (/*fExposureTime > 100 || */fExposureTime < 10) + if (fExposureTime < m_daDeviceAttr.iMinIntegrationTimeInMS) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; bFlagIsLowerMinExposureTime = true; + + qDebug() << "lower-----------------------"<> 8;; qbSend[2] = m_iExposureTime & 0xFF; + + qDebug() << "-------------"<PerformAutoExposure(0.7,0.8,fPredictedExposureTime); + m_FiberSpectrometer->PerformAutoExposure(0.6,0.9,fPredictedExposureTime); } ZZ_S32 ATPFiberImager::GetMaxValue(ZZ_S32 * dark, int number) diff --git a/othersoft/calibration_console/Source_Files/main.cpp b/othersoft/calibration_console/Source_Files/main.cpp index f772b67..09b87bd 100644 --- a/othersoft/calibration_console/Source_Files/main.cpp +++ b/othersoft/calibration_console/Source_Files/main.cpp @@ -47,8 +47,8 @@ void logout(QString str); void createDirectory(QString fullPath); bool isFileExist(QString fullFileName); -int getNonlinearityCoeffs2(long deviceID, double * coeffs); -int getNonlinearityCoeffs1(double * coeffs); +int getNonlinearityCoeffs2(long deviceID, double * nonlinearityCoeffs); +int getNonlinearityCoeffs1(double * nonlinearityCoeffs); int main(int argc, char *argv[]) { @@ -88,14 +88,24 @@ int main(int argc, char *argv[]) //创建光谱仪对象 FiberSpectrometerOperationBase * m_FiberSpectrometer; + bool isOcean = false; + double * nonlinearityCoeffs; + int numberOfNonlinearityCoeffs; switch (query.deviceType) { case OPTOSKY: m_FiberSpectrometer = new ATPFiberImager(false,query.serialPort.toStdString(),"OPTOSKY"); break; case OceanOptics: - m_FiberSpectrometer = new OceanOpticsFiberImager();// + { + //使用sbapi读取海洋光学仪器的非线性定标参数 + nonlinearityCoeffs = new double[100]; + numberOfNonlinearityCoeffs = getNonlinearityCoeffs1(nonlinearityCoeffs); + + m_FiberSpectrometer = new OceanOpticsFiberImager(nonlinearityCoeffs, numberOfNonlinearityCoeffs); + isOcean = true; break; + } case UnknownDevice: parser.showHelp(); Q_UNREACHABLE(); @@ -114,7 +124,7 @@ int main(int argc, char *argv[]) //自动曝光 logout("
AutoExpose!"); - m_FiberSpectrometer->autoExpose(); +// m_FiberSpectrometer->autoExpose(); int iExposureTime; m_FiberSpectrometer->getExposureTime(iExposureTime); @@ -169,56 +179,37 @@ int main(int argc, char *argv[]) QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); copyFileToPath(query.calFileOutputName,destName,true); - //判断仪器类型是否为海洋光学,将结果存储在变量isOcean中 - auto * p_C = dynamic_cast(m_FiberSpectrometer); - bool isOcean = false;// - if (p_C != nullptr) - { -// cout << "Match!!" << endl; - isOcean=true; -// coeffsFrame tmp; -// m_FiberSpectrometer->getNonlinearityCoeffs(tmp); - } - else - { - cout << "not OceanOpticsFiberImager!!" << endl; - } - - //断开光谱仪 - m_FiberSpectrometer->disconnectFiberSpectrometer(); - //return a.exec(); - - //使用sbapi读取海洋光学仪器的非线性定标参数 + //将海洋光学仪器的非线性定标参数写到文件中 if (isOcean) { - double * coeffs = new double[100]; - int numberOfCoeffs = getNonlinearityCoeffs1(coeffs); - QDateTime curDateTime = QDateTime::currentDateTime(); QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); QString nonlinearityCoeffsName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".nonLinear"); -// for (int i = 0; i < numberOfCoeffs; ++i) +// for (int i = 0; i < numberOfNonlinearityCoeffs; ++i) // { // printf("\n"); // -// printf("nonlinearityCoeffs(第%d个): %1.2e\n",i , coeffs[i]); +// printf("nonlinearityCoeffs(第%d个): %1.2e\n",i , nonlinearityCoeffs[i]); // // printf("\n"); // } std::ofstream outfile(nonlinearityCoeffsName.toStdString().c_str()); - for (int i = 0; i < numberOfCoeffs; i++) + for (int i = 0; i < numberOfNonlinearityCoeffs; i++) { - outfile << coeffs[i] << std::endl; + outfile << nonlinearityCoeffs[i] << std::endl; } outfile.close(); - free(coeffs); + free(nonlinearityCoeffs); } + //断开光谱仪 + m_FiberSpectrometer->disconnectFiberSpectrometer();//要放在这句代码之后:free(nonlinearityCoeffs); + //return a.exec(); } CommandLineParseResult parseCommandLine2(QCommandLineParser &parser, TcQuery *query, QString *errorMessage) @@ -539,7 +530,7 @@ bool isFileExist(QString fullFileName) return false; } -int getNonlinearityCoeffs1(double * coeffs) +int getNonlinearityCoeffs1(double * nonlinearityCoeffs) { int number_of_devices; long *device_ids; @@ -608,7 +599,7 @@ int getNonlinearityCoeffs1(double * coeffs) continue; } - number = getNonlinearityCoeffs2(device_ids[i],coeffs); + number = getNonlinearityCoeffs2(device_ids[i],nonlinearityCoeffs); /* Close the device */ // printf("\tAttempting to close:\n"); @@ -626,7 +617,7 @@ int getNonlinearityCoeffs1(double * coeffs) }// //返回值是非线性校正系数的个数 -int getNonlinearityCoeffs2(long deviceID, double * coeffs) +int getNonlinearityCoeffs2(long deviceID, double * nonlinearityCoeffs) { int error = 0; int number_of_nonlinearity_coeff_features; @@ -664,13 +655,19 @@ int getNonlinearityCoeffs2(long deviceID, double * coeffs) // i, deviceID, nonlinearity_coeff_feature_ids[i]); // printf("\t\t\tAttempting to get nonlinearity coefficients...\n"); - memset(coeffs, (int)0, 20);//---------------------------------------------------------------------------- + memset(nonlinearityCoeffs, (int)0, 20);//---------------------------------------------------------------------------- length = sbapi_nonlinearity_coeffs_get(deviceID, - nonlinearity_coeff_feature_ids[i], &error, coeffs, 20); + nonlinearity_coeff_feature_ids[i], &error, nonlinearityCoeffs, 20); // printf("\t\t\t\tResult is %d [%s]\n", length, sbapi_get_error_string(error)); if(0 == error && length > 0) { -// printf("\t\t\t\tFirst calibration term: %1.2e\n", coeffs[0]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[0]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[1]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[2]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[3]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[4]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[5]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[6]); } // printf("\t\t%d: Finished testing device 0x%02lX, nonlinearity coeffs 0x%02lX\n", diff --git a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp index 53b56ba..3c13aaf 100644 --- a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp +++ b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp @@ -1,8 +1,11 @@ #include "Header_Files/oceanOpticsFiberImager.h" -OceanOpticsFiberImager::OceanOpticsFiberImager() +OceanOpticsFiberImager::OceanOpticsFiberImager(double * nonlinearityCoeffs, int numberOfCoeffs) { m_FiberSpectrometer = NULL; + + m_nonlinearityCoeffs = nonlinearityCoeffs; + m_iNumberOfNonlinearityCoeffs = numberOfCoeffs; } OceanOpticsFiberImager::~OceanOpticsFiberImager() @@ -18,15 +21,15 @@ void OceanOpticsFiberImager::connectFiberSpectrometer(QString& SN, QString& pixe m_FiberSpectrometer->Initialize(); - DeviceInfo deviceInfo; - DeviceAttribute deviceAttribute; + getDeviceInfo(m_deviceInfo); +// m_FiberSpectrometer->GetDeviceInfo(m_deviceInfo); - m_FiberSpectrometer->GetDeviceInfo(deviceInfo); - m_FiberSpectrometer->GetDeviceAttribute(deviceAttribute); + getDeviceAttribute(m_deviceAttribute); +// m_FiberSpectrometer->GetDeviceAttribute(m_deviceAttribute); - SN = QString::fromStdString(deviceInfo.strSN); - pixelCount = QString::number(deviceAttribute.iPixels); - wavelengthInfo = QString::number(deviceAttribute.fWaveLengthInNM[0]) + "--" + QString::number(deviceAttribute.fWaveLengthInNM[deviceAttribute.iPixels - 1]); + SN = QString::fromStdString(m_deviceInfo.strSN); + pixelCount = QString::number(m_deviceAttribute.iPixels); + wavelengthInfo = QString::number(m_deviceAttribute.fWaveLengthInNM[0]) + "--" + QString::number(m_deviceAttribute.fWaveLengthInNM[m_deviceAttribute.iPixels - 1]); m_FiberSpectrometer->SetDeviceTemperature(-10); @@ -34,11 +37,11 @@ void OceanOpticsFiberImager::connectFiberSpectrometer(QString& SN, QString& pixe //设置dn值的最大值(和位深相关) string qepro = "QEP"; string flame = "FLMS"; - if (deviceInfo.strSN.find(qepro) != string::npos) + if (m_deviceInfo.strSN.find(qepro) != string::npos) { m_MaxValueOfFiberSpectrometer = 200000; } - else if (deviceInfo.strSN.find(flame) != string::npos) + else if (m_deviceInfo.strSN.find(flame) != string::npos) { m_MaxValueOfFiberSpectrometer = 65535; } @@ -81,6 +84,25 @@ void OceanOpticsFiberImager::getDeviceTemperature(float &fTemperature) void OceanOpticsFiberImager::singleShot(DataFrame &dfData) { m_FiberSpectrometer->SingleShot(dfData); + + if(m_iNumberOfNonlinearityCoeffs==0)//如果非线性校正参数为0个,那么就不做非线性校正 + { + return; + } + + //做非线性校正 + for (int i = 0; i < m_deviceAttribute.iPixels; i++) + { + dfData.lData[i] = dfData.lData[i] / (m_nonlinearityCoeffs[0] + + m_nonlinearityCoeffs[1] * dfData.lData[i] + + m_nonlinearityCoeffs[2] * pow(dfData.lData[i], 2) + + m_nonlinearityCoeffs[3] * pow(dfData.lData[i], 3) + + m_nonlinearityCoeffs[4] * pow(dfData.lData[i], 4) + + m_nonlinearityCoeffs[5] * pow(dfData.lData[i], 5) + + m_nonlinearityCoeffs[6] * pow(dfData.lData[i], 6) + + m_nonlinearityCoeffs[7] * pow(dfData.lData[i], 7) + ); + } } void OceanOpticsFiberImager::getNonlinearityCoeffs(coeffsFrame &coeffs)