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

How to store images in c++ with Ximea

本文关键字:存储 图像 c++ 何用 Ximea      更新时间:2023-10-16

我有一个超高速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 cameran", images, (int)image.width, (int)image.height);
}

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

我将非常感谢任何帮助与代码。

谢谢!

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

让我们先做几个假设。

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

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

好……以下是我最常用的两种从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 %sn", fileName);
        return -1;
    }
    size_t n = 0;
    n += fprintf(file, "P5n# Comment goes here!n%d %dn%dn", 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);

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

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

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

如果您有任何关于XIMEA产品的问题,请访问并直接在XIMEA客户支持上注册。谢谢你。

最诚挚的问候,XIMEA团队