Как вернуть многомерный массив Mat из функции - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу вернуть объект cv :: Mat с размерами [w] [h] [c], где w - ширина, h - высота, а c - каналы или глубина.Но компилятор выдает мне ошибку.

Это мой код:

cv::Mat three_channel_convolution(cv::Mat bgr_image, cv::Mat kernel)
{
   cv::Mat feature_map[3];
   cv::Mat bgr[3];

   cv::split(bgr_image, bgr);

   for (uchar i = 0; i < 3; i++)
   {
      feature_map[i] = one_channel_convolution(bgr[i], kernel);
      std::string name_feature_map = "bgr_feature_map_" + std::to_string(i) + ".jpg";
      cv::imwrite(name_feature_map, feature_map[i]);
   }

return feature_map;
}

В этой функции я хочу сделать свертку с фильтром (ядром) для каждого из трех каналов визображение BGR.Таким образом, функция свертки возвращает результат операции в одном канале (один 2D мат [] []) и сохраняет его в массиве feature_map Mat.Как я могу вернуть этот массив Mat?

Затем в своей функции main () я вызываю функцию следующим образом:

feature_map = three_channel_convolution(image, kernels[0]);

Спасибо за помощь!

1 Ответ

0 голосов
/ 14 февраля 2019

Возвращаемое значение функции three_channel_convolution равно cv::Mat, но вы возвращаете cv::Mat[3].

Если вы хотите вернуть 3d-матрицу, вам нужно изменить сигнатуру функции на что-то вродеstd::array<cv::Mat, 3>.Пожалуйста, имейте в виду, что это может иметь некоторые проблемы с производительностью.

std::array<cv::Mat, 3> three_channel_convolution(cv::Mat bgr_image, cv::Mat kernel) {
   std::array<cv::Mat, 3> feature_map;
   std::array<cv::Mat, 3> bgr;

   cv::split(bgr_image, bgr);

   for (uchar i = 0; i < 3; i++) {
      feature_map[i] = one_channel_convolution(bgr[i], kernel);
      std::string name_feature_map = "bgr_feature_map_" + std::to_string(i) + ".jpg";
      cv::imwrite(name_feature_map, feature_map[i]);
   }

    return feature_map;
}

Ps.Пожалуйста, сообщите точное сообщение об ошибке в следующих сообщениях.

...