У меня есть камера 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 я бы рекомендовал использовать библиотеку OpenCV
поскольку он предоставляет инструменты для хранения форматов изображений JPEG и BMP. Пожалуйста, скачайте
краткий пример, демонстрирующий хранение нескольких разных форматов данных
с камеры на изображения JPEG и BMP. Загрузите архив с проектом MSVC 2013 и двоичными файлами OpenCV3.0 из Вот и использовать пароль SHWJGRAIHFLG для
экстракция.
Если у вас возникнут другие вопросы, касающиеся продуктов XIMEA, посетите
и зарегистрируйтесь прямо на Поддержка клиентов XIMEA. Спасибо.
С наилучшими пожеланиями,
Команда XIMEA
Ага, сохранение изображения. Я думаю, что вы, возможно, уже получили ответ.
Но вот мой, и я надеюсь, что это будет полезно для всех, кто работает с камерами машинного зрения.
Я работаю с XIMEA довольно давно. XIMEA API не включает в себя никаких функций для сохранения изображений из буфера на жесткий диск. Итак, вам нужно написать свою собственную функцию или использовать некоторую библиотеку для сохранения изображений. И я думаю, по сути, все сводится к тому, что это RAW или сжатое изображение, и какой формат изображения вы хотите сохранить. то есть. BMP, JPEG, PNG, PGM, EXR ……
Давайте сначала сделаем пару предположений.
Здесь я предполагаю, что вы хотите сохранить RAW-изображение размером 8 бит на пиксель с разрешением 1024 * 1024. Размер изображения будет 8 бит * 1024 * 1024 = 8388608 бит = 1048576btye ~ = 1 МБ
Глядя на свой код, вы используете XIMEA API в C ++.
Хорошо … Вот два способа, которыми я чаще всего пользовался для сохранения изображений из 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 — это мощная библиотека, которая помогает вам управлять матрицами проще, чем когда-либо. И он поставляется с множеством полезных вещей, таких как функции OpenCV с GPU-ускорением. Вернуться к теме, 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 сохраняет изображение для вас без особых усилий. Вот ссылка на документацию OpenCV imwirte, http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite
Я надеюсь, что мой ответ поможет вам, а другие задаются вопросом, как сохранить изображения.