如何使用Ximea在c ++中存储图像

时间:2015-09-07 10:49:59

标签: c++ image camera save ximea

我有一个superSpeed usb 3.0 Ximea相机,我正试图使用​​包含计算机视觉和机器学习的Ximea相机编写应用程序。

我已经能够将相机捕获的帧分配到它的缓冲区中,但我可以找到将这些图像或帧保存为JPEG或BMP文件的方法。我不知道它是否只是我脚本中的命令行,或者我需要某种类型的库来执行此操作。

使用以下命令获取图像:

#define EXPECTED_IMAGES 10
for (int images=0;images < EXPECTED_IMAGES;images++)
{
    // getting image from camera
    stat = xiGetImage(xiH, 5000, &image);
    HandleResult(stat,"xiGetImage");
    printf("Image %d (%dx%d) received from camera\n", images, (int)image.width, (int)image.height);

}

由于我可以从图像中提取数据,我认为帧仍在缓冲区中,但我无法弄清楚如何将其保存为计算机中的JPEG或BMP文件。

感谢代码的任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:2)

啊哈,保存图像。我想你现在可能已经得到了答案。 但这是我的,我希望这对任何使用机器视觉相机的人都有用。 我已经和XIMEA合作了很长一段时间了。 XIMEA API不包含将图像从缓冲区保存到硬盘驱动器的任何功能。因此,您需要编写自己的函数或使用某些库来保存图像。我认为,基本上它归结为它是RAW还是压缩图像以及你想要保存的图像格式。即。 BMP,JPEG,PNG,PGM,EXR ......

让我们首先做出几个假设。

  1. 这里我假设您要保存分辨率为1024 * 1024的每像素8位RAW图像。图像大小为8bit * 1024 * 1024 = 8388608bit = 1048576btye~ = 1MB

  2. 通过查看代码,您正在使用C ++中的XIMEA API。

  3. 好的......以下是我最常用来保存XIMEA图像的两种方法。

    1. 根据您要保存的格式,使用正确的标题将所有图像像素写入二进制文件。以下是将数据保存为PGM格式图像的示例。

      FILE *file;
      char fileName = "example.pgm";
      char *image;
      int width = 1024;
      int height = 1024;
      int byte_per_pixel = 1;
      int max_pixel_value = 255;
      file = fopen (fileName , "w+bx");
      if(file == NULL){
          fprintf(stderr, "Cannot open %s\n", fileName);
          return -1;
      }
      size_t n = 0;
      n += fprintf(file, "P5\n# Comment goes here!\n%d %d\n%d\n", width, height, max_pixel_value);
      n += fwrite(image, 1, width * height * byte_per_pixel, file);
      fclose (fileToSave);

      将图像保存到PGM可能看起来很简单但是当您需要保存像素深度高于8位的图像时,您需要处理字节序问题,因为PGM大端格式。如果您想了解更多相关信息,可以在此处找到Netpbm格式的链接。 https://en.wikipedia.org/wiki/Netpbm_format

      而且,其他格式可能有更复杂的数据结构,那么你不能简单地放下一个标题。因此,使用图像库或OpenCV将不那么麻烦。

    2. 方便的OpenCV imwrite 。由于你要处理像素,OpenCV是一个很好的库。 OpenCV是一个功能强大的库,可以帮助您比以往更轻松地操作矩阵。它还带有很多有用的东西,比如GPU加速的OpenCV功能。回到主题,imwrite可以将图像保存为多种格式。以下是我编写的将RAW数据保存为PNG格式的示例。

      string fileName = "example.png";
      char *image;
      int width = 1024;
      int height = 1024;
      int byte_per_pixel = 1;
      int max_pixel_value = 255;
      cv::Mat img_raw = cv::Mat(height, width, CV_8UC1, image);
      vector compression_params;
      compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
      compression_params.push_back(0);
      cv::imwrite(PNGFileName, img_raw, compression_params);

      imwirte将根据文件扩展名确定您要保存的格式。只需几行代码。 OpenCV可以毫不费力地为您保存图像。以下是imwirte的开放文档文档的链接,http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite

    3. 我希望我的回答可以帮助你,而其他人则想知道如何保存图像。

答案 1 :(得分:-1)

存储来自XIMEA相机的图像我建议使用OpenCV库 因为它提供了存储JPEG和BMP图像格式的工具。请下载 一个简短的例子,演示了几种不同数据格式的存储 从相机到JPEG和BMP图像。从here下载包含MSVC 2013项目和OpenCV3.0二进制文件的存档,并使用密码SHWJGRAIHFLG 提取

如果您对XIMEA产品有任何其他疑问,请访问 并直接在XIMEA customer support注册。谢谢。

祝你好运, XIMEA团队