如何从函数返回多维Mat数组

问题描述 投票:0回答:1

我想返回一个带[w] [h] [c]维度的cv :: Mat对象,其中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 Mat [] [])中返回操作的结果,并将其存储在feature_map Mat数组中。我怎样才能返回这个Mat数组?

然后在我的main()函数中,我调用这样的函数:

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

谢谢您的帮助!

c++ arrays opencv mat
1个回答
4
投票

函数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。请在其他帖子中报告确切的错误消息。

© www.soinside.com 2019 - 2024. All rights reserved.