我有一个 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 合作已有一段时间了。 XIMEA API 不包含任何将缓冲区中的图像保存到硬盘的函数。因此,您需要编写自己的函数或使用一些库来保存图像。而且我认为,基本上这一切都归结为它是 RAW 图像还是压缩图像,以及您想保存哪种图像格式。 IE。 BMP、JPEG、PNG、PGM、EXR……
让我们先做几个假设。
这里我假设您要保存分辨率为 1024*1024 的每像素 8 位的 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
希望我的回答可以帮助到你和其他想知道如何保存图片的人。
关于c++ - 如何使用 Ximea 在 C++ 中存储图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32436857/