0

所以我希望有人可以帮助我解决这个问题,这对于任何有编程经验的人来说都是显而易见的,但对我来说却不是!请原谅我糟糕的描述,因为我不知道很多事情的正确术语。

基本上,我使用安装了图像采集卡(Matrox Meteor II)的旧(ish)计算机继承了一个项目。我的基本目标是简单地从摄像机实时捕获实时视频,并将其未压缩地写入计算机的硬盘。该卡的编程是用 C 语言完成的,并使用了一个与它捆绑在一起的库,称为 Matrox Imaging Library (MIL)。

目前我只是将我所有的原始图像写成一个位数组并使用 imageJ 来查看它们。我编写了一个使用双缓冲的基本程序,因此将图像捕获到缓冲区然后写入文本文件,同时将下一个图像捕获到另一个缓冲区。我将在下面放一个代码片段,所有 M 前缀命令都来自 MIL 库。但是,您实际上并不需要了解它们来帮助我。

我只使用以下内容:

/* Put the digitizer in asynchronous mode. */
MdigControl(MilDigitizer, M_GRAB_MODE, M_ASYNCHRONOUS);

/* Grab the first buffer. */
MdigGrab(MilDigitizer, MilImage[0]);

/*open my file where I will write the images*/
pfile = fopen("myfile.txt", "wb");

/* Process one buffer while grabbing the other. */
while( !kbhit() )
  {

  /* Grab second buffer while processing first buffer. */
  MdigGrab(MilDigitizer, MilImage[1]);

  /* Synchronize and start the timer. */
  if (NbProc == 0)
     {
     MappTimer(M_TIMER_RESET, M_NULL);
     }

  /* Process the first buffer already grabbed.  */

  /*copy the image to a display buffer*/
  #if COPY_IMAGE 
  MbufCopy(MilImage[0], MilImageDisp);
  #endif      

  /*Here we copy the buffer into a user supplied array*/
  MbufGet(MilImage[0], my_array);

  /* Then we write the array into the text file using fwrite*/
  fwrite(my_array,sizeof(char),sizeof(my_array),pfile);

    /*Output the amount of time it took to process that image*/
    MappTimer(M_TIMER_READ, &Time);
Capture_Time = Time - Time_Holder;
printf("IMG %s took %.7f .\n", text, Capture_Time);
Time_Holder = Time;
    /* Count processed buffers.  */
     NbProc++;         


  /* Grab first buffer while processing second buffer. */
  MdigGrab(MilDigitizer, MilImage[0]);

  /* Process the second buffer already grabbed.  */

  #if COPY_IMAGE 
  MbufCopy(MilImage[1], MilImageDisp);
  #endif      




  /*Here we copy the buffer into our array*/
  MbufGet(MilImage[1], my_array);

  /* Then we write the array into the text file using fwrite*/
  fwrite(my_array,sizeof(char),sizeof(my_array),pfile);

  MappTimer(M_TIMER_READ, &Time);
Capture_Time = Time - Time_Holder;
printf("IMG %s took %.7f .\n", text, Capture_Time);
Time_Holder = Time;


  /* Count processed buffers. */
  NbProc++;         
  }
  getchar();   
   /* Wait last grab end and stop timer. */
   MdigGrabWait(MilDigitizer, M_GRAB_END);

   /*Close our file*/
   fclose(pfile);

我的问题是我想以 24fps 的帧速率进行上述操作,但我发现捕获图像并将它们写入硬盘的过程有时会比这稍慢(减速不一致但程序似乎偶尔会在一帧上挂起约 500 毫秒)。

我想知道是否有人知道一种方法来诊断导致这些减速的原因,以及是否可能是我硬盘的写入速度。

4

1 回答 1

0

这将通过启用 Disk Write Caching 帮助您修复偶尔挂在单帧上的问题。您可以转到C:驱动器-> 属性-> 硬件-> 选择驱动器-> 驱动器属性-> 策略-> 在设备上启用写入缓存。

可以对代码进行的其他修改对应于代码的第一行,您将数字化仪置于 ASYNCHRONOUS 模式而不是使用 MdigControl(milDigitizer,M_GRAB_MODE,M_ASYNCHRONOUS_QUEUED); 这将在每次抓取排队后继续,并且不会等待 Mil 抓取功能退出。

于 2016-02-25T17:14:41.723 回答