Вложение 3-dim cv :: Mat в 4-dim cv :: Mat - PullRequest
0 голосов
/ 30 октября 2019

Мне нужно встроить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...