配置页面2

This commit is contained in:
tangchao0503
2026-04-01 17:04:03 +08:00
parent 50989bcd5b
commit ea1a666619
11 changed files with 179 additions and 109 deletions

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