首页 > 解决方案 > 将 3-dim cv::Mat 嵌入 4-dim cv::Mat

问题描述

我必须将 3 维嵌入cv::Mat到 4 维中。

一些上下文

给定:我有一些执行深度卷积的代码,即我有一个 3-dim 输入矩阵 {channels, w_in, h_in} 和一个 3-dim 3-by3 内核 {channels, 3, 3} 以产生 3-dim 输出{频道,w_out,h_out}。深度卷积现在意味着内核的第一个切片应用于输入的第一个切片以产生输出的第一个切片,依此类推。

我需要什么:我想使用需要 4-dim 内核的标准卷积来重建这种类型的卷积。在 python (pytorch) 中,我可以执行以下操作:

kernel4d = torch.tensor((), dtype=torch.float32)
kernel4d = kernel4d.new_zeros((channels, channels, 3, 3))
for i in range(channels):
    kernel4d[i, i, :, :] = kernel3d[i, :, :]

如何使用 C++ 有效地重写此代码cv::Mat


编辑

int size3d[] = {3, 5, 5};
cv::Mat kernel3d = cv::Mat(3, size3d, CV_32F, cv::Scalar(0));

int size4d[] = {3, 3, 5, 5};
cv::Mat kernel4d = cv::Mat(4, size4d, CV_32F, cv::Scalar(1));

// Try 1
for (int i = 0; i < 3; i++){
    kernel4d.at<float>(i, i) = kernel3d.at<float>(i);
}
// Result: Sets only single values at (i, i, 0, 0)

// Try 2
for (int i = 0; i < 3; i++){
    for (int k = 0; k < 5; k++){
        for (int l = 0; l < 5; l++){
            kernel4d.at<float>(i, i, k, l) = kernel3d.at<float>(i, k, l);
        }
    }
}
// Result: at does not exept 4 indexes

标签: c++opencv

解决方案


推荐阅读