Изменить порядок размеров blobFromImage в OpenCV

#c #opencv

#c #opencv

Вопрос:

Я столкнулся с проблемой с функцией C blobFromImage в OpenCV. Я обучил CNN-сеть в Keras, которая принимает 4-мерный большой двоичный объект в качестве входных данных (обычная практика, ничего особенного). Проблема в том, что мой порядок больших двоичных объектов равен NHWC (где размер канала всегда равен 6), но blobFromImage возвращает только NCHW. Нет никаких проблем с изменением формы numpy-blob в python, но я не нашел никакого решения для C .

Входные данные представляют собой два 3-канальных изображения, сшитых вместе (по оси канала) в одном большом двоичном объекте. Например, если разрешение изображения равно 1280х720, то форма большого двоичного объекта будет (1, 720, 1280, 6)

Есть ли какой-либо способ создать большой двоичный объект NHWC на C или преобразовать результат blobFromImage в NHWC?

Ответ №1:

Похоже, вы получили ответ на свой вопрос на форуме OpenCV

предполагая, что у вас есть 2 (плавающих) изображения A и B одинакового размера, по 3 канала в каждом, вы можете сначала объединить их следующим образом:

 vector<Mat> v = {A,B};
Mat C;
merge(v, C);
  

теперь C имеет 6 чередующихся каналов, и нам нужно добавить измерение «batch»:

 int sz[] = {1, A.rows, A.cols, 6};
Mat blob(4, sz, CV_32F, C.data);
  

но осторожно! ваш большой двоичный объект НЕ содержит глубокой копии данных, поэтому C должен быть сохранен в рабочем состоянии во время обработки!

РЕДАКТИРОВАТЬ: из-за общественного спроса, вот обратная операция 😉

 // extract 2d, 6chan Mat 
Mat c2(blob.size[2], blob.size[3], CV_32FC(6), blob.ptr(0));

// split into channels
vector<Mat> v2;
split(c2,v2);

// merge back into 2 images
Mat a,b;
merge(vector<Mat>(v2.begin(),   v2.begin() 3), a);
merge(vector<Mat>(v2.begin() 3, v2.end()),     b);
  

Комментарии:

1. Правильно, ответ мне помог.