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

How to store images in c++ with 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 文件。

对于代码方面的任何帮助,我将不胜感激。

谢谢!

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

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

此致, XIMEA团队

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

让我们先做几个假设。

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

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

好的......下面是我最常用的两种从XIMEA保存图片的方法。

  1. 将所有图像像素写入二进制文件,并根据您要保存的格式使用适当的header。这是将数据保存为 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 big-endian 格式。如果您想阅读更多相关信息,这里有一个 link 到 Netpbm 格式。 https://en.wikipedia.org/wiki/Netpbm_format

    而且,其他格式可能有更复杂的数据结构,你不能简单地写一个 header。所以,使用图像库或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 的 link 到 OpenCV 文档,http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite

希望我的回答可以帮助到你和其他想知道如何保存图片的人。