#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. Правильно, ответ мне помог.