c++ openCv 中的错误我的第一个代码(中值滤波器)

Error in c++ openCv my very first code (median filter)

嗨,我刚开始使用 c++/openCv 并尝试编写中值代码 我很困惑……

编辑2: 好的,感谢亲爱的朋友,我的第一个错误已得到纠正 现在这是我的新错误:| 我想对 9 元素的 Mat 文件进行排序。我可以将其他类型用于 window 而不是 Mat 文件吗?我怎样才能正确排序

错误指的是这一行: std::sort(window.begin(), window.end()); 错误:请求 'window' 中的成员 'begin',属于非 class 类型 'cv::Mat [9]'| |36|错误:请求 'window' 中的成员 'end',属于非 class 类型 'cv::Mat [9]'|

我精通了 matlab,完全不懂 C++,这是我的代码:

using namespace std;
using namespace cv;
Mat img_gray,img;

int main ()
{

img = imread( "6.jpg", IMREAD_COLOR ); // Load an image
if( img.empty() )
    { return -1; }
cvtColor( img, img_gray, COLOR_BGR2GRAY );
int M = img.rows;
int N = img.cols;
cvNamedWindow("windows",WINDOW_AUTOSIZE);
imshow("windows",img);
for (int m = 2; m < M - 1; ++m)
    for (int n = 2; n < N - 1; ++n)
    {
        int k = 0;
        int tmpmedian = 0;
        //int window[9]={0};
        Mat window[9];
        for (int i = m - 1; i < m + 2; ++i){
            for (int j = n - 1; j < n + 2; ++j)
            {
                window[k++] = img_gray.at<uchar>(i, j);
            }
            std::sort(window.begin(), window.end());
            tmpmedian = window[5];
            fimg[m][n] = tmpmedian;
        }
    }
}

我是一名学生,我的 class 项目需要这个 非常感谢您的回复

在双 for 循环中,试试这个。

int k = 0;
int tmpmedian = 0;
int window[9]={0};
for (int i = m - 1; i < m + 2; ++i)
    for (int j = n - 1; j < n + 2; ++j)
        window[k++] = img_gray.at<uchar>(i, j);
std::sort(std::begin(window), std::end(window));
tmpmedian = window[4];
fimg[m][n] = tmpmedian;
  1. Mat window[9]声明了9个Mat类型对象的数组。我认为你不会想要那个。您只需要一个包含 9 int 个值的数组。所以你需要的是int window[9].

  2. 您对 std::begin()std::end() 的用法是错误的。 std::sort(std::begin(window), std::end(window))就是你所需要的。

  3. 数组索引从零开始。所以你的中位数存储在 window[4] 而不是 window[5].