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

Posted

技术标签:

【中文标题】如何使用 Ximea 在 C++ 中存储图像【英文标题】:How to store images in c++ with Ximea 【发布时间】:2015-09-07 10:49:58 【问题描述】:

我有一个 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 文件。

如果对代码有任何帮助,我将不胜感激。

谢谢!

【问题讨论】:

【参考方案1】:

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

让我们先做几个假设。

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

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

好的......这是我最常用的两种保存 XIMEA 图像的方法。

    将所有图像像素写入二进制文件,并根据您要保存的格式使用适当的标题。这是一个将数据保存为 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 会少很多麻烦。

    方便的 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的OpenCV文档的链接,http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite

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

【讨论】:

【参考方案2】:

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

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

最好的问候, XIMEA团队

【讨论】:

错误答案的完美示例。没有解释和断开的链接。 感谢您的注意,下载链接已修复,现在应该可以使用了。

以上是关于如何使用 Ximea 在 C++ 中存储图像的主要内容,如果未能解决你的问题,请参考以下文章

从 IplImage 中提取并保存图像

从浏览器手动将图像存储在 Firebase 存储中。如何使其反映在实时数据库中。这样我就可以在 Android 应用程序中获取

如何使 MSVS C++ CToolBar 上的按钮连同它们的图像一起变大?

如何使存储的图像文件夹只能通过 php 代码访问

C++如何把位图保存到数组中

如何使 Git 提交哈希在 C++ 代码中可用而无需重新编译?