在 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 尺寸顺序的主要内容,如果未能解决你的问题,请参考以下文章

opencv进阶-DNN相关API解读

用opencv的dnn模块调onnx模型文件

OpenCV 函数在 Python 和 C++ 中不起作用

OpenCV-Python实战(19)——OpenCV与深度学习的碰撞

在 OpenCV 中更改相机设置

如何在opencv中更改实验室垫中的像素