Мне нужно встроить 3-мерное cv::Mat
в 4-мерное.
Некоторый контекст
Учитывая: У меня есть код, выполняющий глубинусвертка, т. е. у меня есть 3-мерная входная матрица {channel, w_in, h_in} и 3-мерная ядро 3-by3 {channel, 3, 3} для получения 3-мерного выхода {channel, w_out, h_out}. Глубинная свертка теперь означает, что первый срез ядра применяется к первому срезу входных данных для получения первого среза выходных данных и т. Д.
Что мне нужно: Iхочу перестроить этот тип свертки, используя стандартную свертку, для которой требуется 4-мерное ядро. В 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
?
EDIT
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