在 OpenCV 中更改 blobFromImage 尺寸顺序
Posted
技术标签:
【中文标题】在 OpenCV 中更改 blobFromImage 尺寸顺序【英文标题】:Change blobFromImage dimensions order in OpenCV 【发布时间】:2020-10-22 09:19:33 【问题描述】:我在 OpenCV 中遇到了 C++ blobFromImage 函数的问题。我在 Keras 中训练了一个 CNN 网络,它以 4-d blob 作为输入(常见做法,没什么特别的)。问题是我的 blob 顺序是 NHWC(其中 Channle 大小始终为 6),但 blobFromImage 仅返回 NCHW。在 python 中重塑 numpy-blob 没有任何麻烦,但我还没有找到 C++ 的任何解决方案。
输入数据是两个 3 通道图像拼接在一起(在通道轴上)在一个 blob 中。例如,如果图像分辨率为 1280x720,则 blob 形状将为 (1, 720, 1280, 6)
有没有办法在 C++ 中创建 NHWC 的 blob 或将 blobFromImage 结果重塑为 NHWC?
【问题讨论】:
【参考方案1】:您似乎在OpenCV forum 中收到了您的问题的答案
假设,您有 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);
但要小心!您的 blob 不包含数据的深层副本,因此 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);
【讨论】:
没错,答案对我有帮助。以上是关于在 OpenCV 中更改 blobFromImage 尺寸顺序的主要内容,如果未能解决你的问题,请参考以下文章