等效于 numpy.transpose 和 numpy.expand_dims in C++ (OpenCV)

equivalent for numpy.transpose and numpy.expand_dims in C++ (OpenCV)

提问人:LeXela-ED 提问时间:2/27/2022 最后编辑:LeXela-ED 更新时间:2/27/2022 访问量:595

问:

我正在尝试将以下用 Python 编写的代码转换为 C++:

blob = cv2.dnn.blobFromImages(frames, 1.0, (SAMPLE_SIZE, SAMPLE_SIZE), (0, 0, 0), swapRB=True, crop=True)
blob = np.transpose(blob, (1, 0, 2, 3))
blob = np.expand_dims(blob, axis=0)

但是,我不知道该怎么做,在 C++ 和/或 OpenCV 中。任何帮助或建议将不胜感激。np.transposenp.expand_dims

python c++ numpy opencv 转置

评论

0赞 berak 2/27/2022
这是来自action_recognition.py样本吗?
0赞 LeXela-ED 2/27/2022
是的。它来自action_recognition.py

答:

1赞 berak 2/27/2022 #1

你可以试试这个(是的,我知道,它看起来很奇怪......

// the input blob structure for the resnet-34_kinetics action recognition,
// taken from:
// https://github.com/opencv/opencv/blob/master/modules/dnn/test/test_onnx_importer.cpp#L611
//
Mat blob5D(const std::vector<Mat> &images) {
    Mat blob0 = blobFromImages(images, 1.0, Size(112, 112), Scalar(114.7748, 107.7354, 99.4750), true, true);

    Net permute;
    LayerParams lp;
    int order[] = {1, 0, 2, 3};
    lp.set("order", DictValue::arrayInt<int*>(&order[0], 4));
    permute.addLayerToPrev("perm", "Permute", lp);
    permute.setInput(blob0);
    Mat input0 = permute.forward().clone();

    int dims[] = {1, 3, 16, 112, 112}; // 16 == time batch size
    return input0.reshape(0, 5, &dims[0]);
}

然后,你可能应该改变方式,图像被采样—— 不是连续的(就像在 py 示例中一样),而是将你的剪辑分成 16 个等距步骤(就像在训练代码中所做的那样)

GL与它!

评论

0赞 LeXela-ED 2/28/2022
非常感谢@berak。问题解决了!但是,我完全不明白解决方案!是否有任何合适的资源来阅读和熟悉正在发生的事情?:->
0赞 berak 2/28/2022
同样,它取自一些 DNN 单元测试(请参阅评论中的链接),是的,我也花了一段时间才发现它。也许看看原始的 PyTorch 存储库