【问题标题】:Change blobFromImage dimensions order in OpenCV在 OpenCV 中更改 blobFromImage 尺寸顺序
【发布时间】: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?

【问题讨论】:

    标签: c++ opencv


    【解决方案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);
    

    【讨论】:

    • 没错,答案对我有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多