Ошибка в c++ openCv, мой самый первый код (медианный фильтр)

привет, я только что начал c++/openCv и пытаюсь написать средний код, я немного запутался......

EDIT2: ОК, спасибо, дорогие друзья, моя первая ошибка исправлена, теперь это моя новая ошибка: | Я хочу отсортировать 9-элементный файл Mat. Могу ли я использовать другой тип для файла window, а не для файла Mat? как я могу правильно отсортировать

ошибка относится к этой строке: std::sort(window.begin(), window.end()); ошибка: запрос элемента 'begin' в 'окне', т.е. неклассового типа 'cv::Mat [9]'| |36|ошибка: запрос члена 'end' в 'окне', который имеет неклассовый тип 'cv::Mat [9]'|

Я использовал Matlab, и я полный нуб в С++, это мой код:

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;
        }
    }
}

я студент, и мне это нужно для моего классного проекта, и я ценю ваши ответы, большое спасибо


person Ali Z    schedule 06.06.2017    source источник
comment
Вы можете получить доступ к значению переменной Mat в пикселях, используя img.at‹uchar›(y, x); Пример кода: Vec3b intensity = img.at<uchar>(y, x); uchar blue = intensity.val[0]; uchar green = intensity.val[1]; uchar red = intensity.val[2];   -  person Ibrahim    schedule 06.06.2017
comment
спасибо, чувак, это работает img.at‹uchar›(y, x); очень хорошо, теперь у меня возникла проблема с сортировкой, и я понял, что медиана отсортированного 9-элементного вектора не является 5-м элементом! :|   -  person Ali Z    schedule 06.06.2017
comment
конечно, медиана отсортированного 9-элементного вектора его 5-й элемент (конечно, с индексом 4). что еще должно быть?   -  person Piglet    schedule 06.06.2017


Ответы (1)


В своем двойном цикле 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].

person nglee    schedule 06.06.2017