Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c++;与西米亚_C++_Image_Camera_Save_Ximea - Fatal编程技术网

C++ 如何在c++;与西米亚

C++ 如何在c++;与西米亚,c++,image,camera,save,ximea,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++) {

我有一个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);

}
#定义预期的图像10
对于(int images=0;images
由于我可以从图像中提取数据,我假设帧仍在缓冲区中,但我无法找出将其保存为计算机中的JPEG或BMP文件的方法

我将非常感谢您对代码的任何帮助


谢谢大家!

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

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

致以最良好的祝愿,
XIMEA团队

啊哈,正在保存图像。我想你现在可能已经得到答案了。 但这是我的,我希望这对任何使用机器视觉相机的人都有用。 我已经在西米亚工作了很长一段时间了XIMEA API不包含任何将图像从缓冲区保存到硬盘的函数。因此,您需要编写自己的函数或使用一些库来保存图像。我认为,从本质上讲,这一切都取决于它是原始图像还是压缩图像,以及你想保存什么样的图像格式。例如BMP、JPEG、PNG、PGM、EXR

让我们先做两个假设

  • 在这里,我假设您希望保存分辨率为1024*1024的每像素8位原始图像。图像的大小将为8bit*1024*1024=8388608bit=1048576btye~=1MB

  • >P>通过查看代码,您在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位的图像时,您需要处理endianness问题,因为PGM采用big-endian格式。如果您想了解更多有关Netpbm格式的信息,请访问下面的链接

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

  • 便捷的OpenCV imwrite。因为要处理像素,OpenCV是一个很好的库。OpenCV是一个功能强大的库,可以帮助您比以往更轻松地操作矩阵。它附带了很多有用的东西,比如GPU加速的OpenCV函数。回到主题,imwrite可以将图像保存为多种格式。下面是我编写的将原始数据保存为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文档的链接


  • 我希望我的答案能帮助您和其他想知道如何保存图像的人。

    一个错误答案的完美例子。没有解释和断开的链接。谢谢你的提示,下载链接已经修复,现在应该可以工作了。