我有一个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文件。
感谢代码的任何帮助。
谢谢!
答案 0 :(得分:2)
啊哈,保存图像。我想你现在可能已经得到了答案。 但这是我的,我希望这对任何使用机器视觉相机的人都有用。 我已经和XIMEA合作了很长一段时间了。 XIMEA API不包含将图像从缓冲区保存到硬盘驱动器的任何功能。因此,您需要编写自己的函数或使用某些库来保存图像。我认为,基本上它归结为它是RAW还是压缩图像以及你想要保存的图像格式。即。 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的开放文档文档的链接,http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite
我希望我的回答可以帮助你,而其他人则想知道如何保存图像。
答案 1 :(得分:-1)
存储来自XIMEA相机的图像我建议使用OpenCV库 因为它提供了存储JPEG和BMP图像格式的工具。请下载 一个简短的例子,演示了几种不同数据格式的存储 从相机到JPEG和BMP图像。从here下载包含MSVC 2013项目和OpenCV3.0二进制文件的存档,并使用密码SHWJGRAIHFLG 提取
如果您对XIMEA产品有任何其他疑问,请访问 并直接在XIMEA customer support注册。谢谢。
祝你好运, XIMEA团队