如何用Ximea在c++中存储图像
How to store images in c++ with Ximea
我有一个超高速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 ......
让我们先做几个假设。
-
这里我假设你想保存每像素8位的RAW图像,分辨率为1024*1024。图片大小为8bit * 1024 * 1024 = 8388608bit = 1048576btype ~= 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 %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将不那么麻烦。
-
方便的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团队
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 存储将单个查询图像与多个图像的列表匹配的关键点索引
- 如何将捕获的图像存储在OpenCV中(将图片保存到计算机)
- 如何将多个图像存储到多个矩阵中
- 存储在矢量中的图像都是相同的
- 如何创建矩阵的矢量来存储大量的图像
- 对整个垫子图像进行排序并在 OpenCV 中存储索引
- 将图像存储在垫子矢量中
- 获取存储在矩阵中的图像 ROI 的平均 R、G 和 B
- 如何以最佳方式将高分辨率图像数据存储在无符号字符*中C++
- 如何将来自不同图像的多个描述符存储在C++和OpenCV中的向量向量中
- 为 ppm/pgm 图像数据创建存储
- 从数据库中以 blob 数据类型形式存储的原始图像数据中检索 CImage 对象
- OpenCV代码将存储在列表中的描述符与新的图像描述符进行比较
- 如何将图像中的每个像素作为16位索引存储到颜色表中
- 存储矢量的精确内存图像
- 如何将图像存储为 1*n 浮点向量
- 当传递给对象时,SDL_Surface在内存中存储图像的新实例,还是指向传递给它的图像?
- 如何用Ximea在c++中存储图像
- 使用c++ API在HDF5文件中存储图像