#include "Header_Files/ximeaimager.h" XimeaImager::XimeaImager() { m_buffer=nullptr; m_bRecordControl=false; m_iFrameCounter=0; m_iImagerState=100; //connect(this, SIGNAL(recordFinished()),this, SLOT()); 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))); } void XimeaImager::openImger() { if(m_iImagerState != 100)//如果相机已经打开或者已经出错,就直接返回 { emit ximeaImageStatus(m_iImagerState); return; } try { //std::cout<<"XimeaImager::openImger111111111111111111111:正在打开相机!"<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); printf("开始采集!\n"); m_iFrameCounter=0; m_bRecordControl=true; m_imager.start(); m_baseFileName=baseFileName; QString imageFileName=m_baseFileName+".bil"; QString timesFileName=m_baseFileName+".times"; // FILE *hFile=fopen(imageFileName.toStdString().c_str(),"w+b"); FILE *hHimesFile=fopen(timesFileName.toStdString().c_str(),"w+"); using namespace std; ofstream timesFileHandle(timesFileName.toStdString()+"_ofstream"); struct timeval timeStart, timeEnd; double runTime=0; gettimeofday(&timeStart, NULL); while (m_bRecordControl) { unsigned short *x=m_imager.get_frame(m_buffer); //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();//强制系统将系统文件缓冲的内容写入磁盘 m_iFrameCounter+=1; // if(m_iFrameCounter==100) // break; double sbgTime=getSbgTime(TimeDifferenceBetweensOSAndSbg); fprintf(hHimesFile,"%f\n",sbgTime); //fwrite(&sbgTime,sizeof(double),1,hHimesFile); timesFileHandle << sbgTime << "\n"; // std::cout<<"XimeaImager::startRecord---std::cout: "< 5*60) //这个判断会导致丢帧率的大幅升高:5% → 20%,推测原因:除法耗时; // { // break; // } // unsigned char pixel = *(unsigned char*)image.bp;//Default value: XI_MONO8 // unsigned short pixel =*(unsigned short*)image.bp;//XI_RAW16 // printf("Image %d (%dx%d) received from camera. First pixel value: %d\n", m_iFrameCounter, (int)image.width, (int)image.height, pixel); } gettimeofday(&timeEnd, NULL); runTime = (timeEnd.tv_sec - timeStart.tv_sec ) + (double)(timeEnd.tv_usec -timeStart.tv_usec)/1000000; double frameInTheory=runTime * getFramerate(); double frameLossed=frameInTheory - m_iFrameCounter; double frameLossRate=frameLossed / frameInTheory; 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 <