在C ++中有效地保存了许多连续记录的图像
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C ++中有效地保存了许多连续记录的图像相关的知识,希望对你有一定的参考价值。
我面临以下问题: 我使用C ++程序来控制连接到PC的科学相机。它以尽可能快的快门时间拍摄照片(每张图像约1秒)。
在当前阶段,程序在制作完成后立即将每张照片保存到硬盘驱动器中。看来,I/O
访问需要花费很多时间(每次节省大约1/2秒),这大大降低了图像速率。
我一直在考虑先存储许多图像(例如,在数组中),然后将它们全部保存在一个批次中。 那会有用吗?有什么好的选择吗?如何处理这样的问题?
制作视频而不是图像不是一种选择。
非常感谢你
编辑:这是我正在使用的代码:
// capture loop: add up 'preint' images read out with 12 bit adc resolution
// and save them as 16 bit image
// read out current shutter register
// read the 32-bit hex value into the unsigned long member of the above defined union
cam.ReadRegister( 0x918, &curShutter.ulValue );
fCurShutter = curShutter.fValue;
cout << "Grab # " << ip.cnt << "; Serv: " << ip.servopos << "; Expt: " << ip.exptime << "; T: " << ip.temp << "; prog " ;
//inner capture loop
for ( int imageCnt=0; imageCnt < ip.preint; imageCnt++ )
{
error = cam.RetrieveBuffer( &monoImage );
if (error != PGRERROR_OK){PrintError( error ); continue;}
cout << "." ;
//convert to cv::Mat image
unsigned int rowBytes = (double)monoImage.GetReceivedDataSize()/(double)monoImage.GetRows();
cv_image = cv::Mat(monoImage.GetRows(), monoImage.GetCols(), CV_16UC1, monoImage.GetData(),rowBytes);
cv_sum_image = cv_sum_image + cv_image/ip.preint;
cv::imshow("image", cv_sum_image);
cv::waitKey(1);
}
//t=GetTickCount() - t;
unsigned int shutterus = fCurShutter*1000000;
{
//create filename and save co-added image
ostringstream filename;
filename << ip.mode <<"_"<< ip.cdt << "_" << setfill('0') << setw(5) << ip.cnt << "_" << ip.servopos << "_" << setfill('0') << setw(6) << shutterus << "_" << ip.preint << "_" << ip.temp << "_" << ip.pres <<".pgm";
//cv::string ss = filename.str();
string ss = filename.str();
cv::imwrite(ss,cv_sum_image);
}
// Stop capturing images
error = cam.StopCapture();
if (error != PGRERROR_OK){PrintError( error ); return -1;}
// Disconnect the camera
error = cam.Disconnect();
if (error != PGRERROR_OK){ PrintError( error ); return -1;}
return 0;
}
也许问题在于opencv例程?
答案
看看你的代码,最可能的罪魁祸首是openCV imwrite函数。您应该知道imwrite也根据提供的文件扩展名(在您的情况下为.pgm)对输出进行编码。
PGM格式本质上非常简单,但是查看openCV代码时会进行一些处理,并且数据一次处理一个字节,这可以解释您所看到的缓慢。
首先,我会尝试使用更简单的文件格式,只是为了验证imwrite函数确实是问题所在。 Open CV可以以.bmp格式写入文件,并且编码器看起来更简单,并且应该更快。
如果这个假设得到确认,那么你可以采取相当多的行动方案。我的头脑中有几个:
- 在您的问题中,延迟写入文件,直到您的时间敏感操作完成。这一般来说很有意义,但你很可能无法将所有图像都放在内存中(每1000张图像大约600mb你想做)。
- 为文件存储操作创建专用线程,并将工作卸载到此其他线程。
- 尽可能快地将图像存储在HDD上(以.bmp格式,或实现自己的文件编写器,只将对象从内存转储到硬盘驱动器),然后将它们后处理为您需要的格式。
另一答案
原来由于硬件损坏导致强烈延迟。我们使用的电缆不允许足够的数据流。
以上是关于在C ++中有效地保存了许多连续记录的图像的主要内容,如果未能解决你的问题,请参考以下文章