在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格式写入文件,并且编码器看起来更简单,并且应该更快。

如果这个假设得到确认,那么你可以采取相当多的行动方案。我的头脑中有几个:

  1. 在您的问题中,延迟写入文件,直到您的时间敏感操作完成。这一般来说很有意义,但你很可能无法将所有图像都放在内存中(每1000张图像大约600mb你想做)。
  2. 为文件存储操作创建专用线程,并将工作卸载到此其他线程。
  3. 尽可能快地将图像存储在HDD上(以.bmp格式,或实现自己的文件编写器,只将对象从内存转储到硬盘驱动器),然后将它们后处理为您需要的格式。
另一答案

原来由于硬件损坏导致强烈延迟。我们使用的电缆不允许足够的数据流。

以上是关于在C ++中有效地保存了许多连续记录的图像的主要内容,如果未能解决你的问题,请参考以下文章

在 C 数组中保存内存地址内容

打开图像并使用相同的参数重新保存它,c#

如果能够并行执行很少的进程,那么能够有效地生成许多进程有什么意义呢?

通过网络连续传输图像的最有效方式

ply格式文件,用C语言怎么读入,并存储在哪种数据结构中

如何有效地将数据附加到 C 中的 HDF5 表?