#include "Header_Files/ximeaimager.h" XimeaImager::XimeaImager() { m_buffer=nullptr; m_bRecordControl=false; m_iFrameCounter=0; m_iImagerState=100; QString ximeaCfgFile = "/media/nvme/300TC/config/ximea.cfg"; m_configfile.setConfigfilePath(ximeaCfgFile.toStdString()); if(!m_configfile.isConfigfileExist()) m_configfile.createConfigFile(); m_configfile.parseConfigfile(); m_recordTempThread=new QThread(); m_ximeaTemperature = new RecordXimeaTemperature(&m_imager); m_ximeaTemperature->moveToThread(m_recordTempThread); m_recordTempThread->start(); connect(this, SIGNAL(recordXimeaTemperatureSignal(QString)),m_ximeaTemperature, SLOT(recordTemperature(QString))); writeData2DiskThread = new QThread(); writeData2Disk = new WriteData2Disk(); writeData2Disk->moveToThread(writeData2DiskThread); writeData2DiskThread->start(QThread::HighestPriority); connect(this, SIGNAL(startWriteDiskSignal()), writeData2Disk, SLOT(write2Disk())); m_pool = new MemoryPool; q = new queue; m_rgbImage = new rgbImage(); } XimeaImager::~XimeaImager() { } void XimeaImager::openImger() { if(m_iImagerState != 100)//如果相机已经打开或者已经出错,就直接返回 { emit ximeaImageStatus(m_iImagerState); return; } try { //std::cout<<"XimeaImager::openImger111111111111111111111:正在打开相机!"<SetRgbImageWidthAndHeight(height, width, 20); std::cout<<"height:"<< height <stopRecordTemperature(); if(m_iImagerState==100) { emit ximeaImageStatus(m_iImagerState); return; } try { m_imager.disconnect(); m_iImagerState=100; emit ximeaImageStatus(m_iImagerState); } catch(int xiApiErrorCodes) { std::cout<<"XimeaImager::closeImger-------------------!"<maxValue) { //std::cout<<"像素值为:"<< *(data + i) <stopRecordTemperature();//开始采集影像前,停止获取相机的温度,以免降低帧率; try { if(m_iImagerState <= 99 || m_iImagerState==100 || m_iImagerState==104) { emit ximeaImageStatus(m_iImagerState); return; } m_iImagerStateTemp=m_iImagerState; m_iImagerState=104; emit ximeaImageStatus(m_iImagerState); char * timeFormat="%Y%m%d_%H%M%S"; QString timeStr = formatTimeStr(timeFormat); printf("开始采集:%s!\n", timeStr.toStdString().c_str()); m_iFrameCounter=0; m_bRecordControl=true; m_baseFileName=baseFileName; QString timesFileName=m_baseFileName+".times"; FILE *hHimesFile=fopen(timesFileName.toStdString().c_str(),"w+"); // ofstream timesFile(timesFileName.toStdString()); std::cout << "曝光时间为:" << getExposureTime()/1000 << "ms" <setParm(q,m_baseFileName,m_iFrameSizeInByte, number_WriteDisk, m_pool, m_rgbImage); emit startWriteDiskSignal(); int indexofbuff; DataBuffer * buffer; m_imager.start(); struct timeval timeStart, timeEnd; double runTime=0; gettimeofday(&timeStart, NULL); while (m_bRecordControl) { unsigned short *x=m_imager.get_frame(m_buffer); m_iFrameCounter+=1; //fwrite(m_buffer,2,getBandCount()*getSampleCount(),hFile); // fwrite(m_imager.m_image.bp,static_cast(m_imager.m_image.bp_size),1,hFile); //fflush(hFile);//只保证了将IO缓冲写入系统缓冲中,使IO读操作能成功,但系统什么时候写入磁盘,由系统决定,一般是达到一定量时系统他就写入磁盘。 //sync();//强制系统将系统文件缓冲的内容写入磁盘 indexofbuff = m_iFrameCounter % number_WriteDisk; if (indexofbuff == 1) { r_qtx.lock(); buffer = m_pool->newElement(); r_qtx.unlock(); } if (indexofbuff == 0) { memcpy((void *)buffer->data + (number_WriteDisk - 1) * m_iFrameSizeInByte,m_imager.m_image.bp,m_iFrameSizeInByte); } else { memcpy((void *)buffer->data + (indexofbuff - 1) * m_iFrameSizeInByte,m_imager.m_image.bp,m_iFrameSizeInByte); } if (indexofbuff == 0) { r_qtx.lock(); q->push(buffer); r_qtx.unlock(); } double sbgTime=getSbgTime(TimeDifferenceBetweensOSAndSbg); fprintf(hHimesFile,"%f\n",sbgTime); // fwrite(&sbgTime,sizeof(double),1,hHimesFile); // timesFile<exitWriteData2Disk(); m_iFrameCounter = m_iFrameCounter - indexofbuff; if (indexofbuff != 0) { m_pool->deleteElement(buffer); } double frameInTheory=runTime * getFramerate() - indexofbuff; double frameLossed=m_imager.m_image.acq_nframe - indexofbuff - m_iFrameCounter; double frameLossRate=frameLossed / (m_imager.m_image.acq_nframe - indexofbuff); std::cout<<"当前采集文件为: "<getTemperature(); QDateTime curDateTime = QDateTime::currentDateTime(); QString currentTime = curDateTime.toString("yyyy/MM/dd hh:mm:ss"); ximeaTemperatureFile << currentTime.toStdString() << "," << temp << "\n"; // std::cout<<"RecordXimeaTemperature::recordTemperature----------------:ximea Temperature is "<< temp <empty(); r_qtx.unlock(); if(bempty && isExitWriteData2Disk) { std::cout<<"WriteData2Disk::write2Disk-----------------------队列为空,采集线程已经退出!"<front(); memcpy(dataBuffer,buffer->data,m_iFrameSizeInByte*m_iNumber_WriteDisk); // m_pool->destroy(m_q->front()); m_pool->deleteElement(buffer); m_q->pop(); r_qtx.unlock(); //构造rgb图像,用于推流到m300遥控器 // m_rgbImage->FillRgbImage(dataBuffer); // std::cout<<"WriteData2Disk::write2Disk-----------------------正在写磁盘!" << m_pool->max_size() <m_VideoWriter.release(); fclose(hFile); std::cout<<"WriteData2Disk::write2Disk-----------------------写磁盘线程将退出,内存池可达到的最多元素数:" << m_pool->max_size() < * q, QString baseFileName, int frameSizeInByte, int number_WriteDisk, MemoryPool * pool, rgbImage * rgbImage) { m_q = q; m_QbaseFileName = baseFileName; m_iFrameSizeInByte = frameSizeInByte; m_iNumber_WriteDisk = number_WriteDisk; m_pool = pool; m_rgbImage = rgbImage; }