Ошибка инициализации структуры данных Mat (массива)

#c #opencv

#c #opencv

Вопрос:

Я пишу код opencv для фильтра частиц, но я получаю некоторую ошибку, я думаю, это из-за приведенного ниже кода.Как я могу инициализировать массив Mat во время самого объявления?

 Mat particle[N];
for (int i = 0; i < N; i  )
    {
        particle[i].at<float>(0, 0) = rec.x   distribution(generator);//x
        particle[i].at<float>(1, 0) = rec.y   distribution(generator);//y
        particle[i].at<float>(2, 0) = 0;//vel(x)
        particle[i].at<float>(3, 0) = 0;//vel(y)
        particle[i].at<float>(4, 0) = min(0.66   abs(rng.uniform(0, 1)), MAX_a);//a
        particle[i].at<float>(5, 0) = rec.height   10   rng.uniform(0, 1);//vel(h)
        weight[i] = 1.0 / N;
    }
  

Ответ №1:

Почему вы не используете std::vector:

 std::vector<cv::Mat> particle(N, cv::Mat(6, 1, CV_32F)); // constructor which takes
// number of elems and allocates memory of them using second argument as a prototype object
for (int i = 0; i < N; i  )
    {
        particle[i].at<float>(0, 0) = rec.x   distribution(generator);//x
        particle[i].at<float>(1, 0) = rec.y   distribution(generator);//y
        particle[i].at<float>(2, 0) = 0;//vel(x)
        particle[i].at<float>(3, 0) = 0;//vel(y)
        particle[i].at<float>(4, 0) = min(0.66   abs(rng.uniform(0, 1)), MAX_a);//a
        particle[i].at<float>(5, 0) = rec.height   10   rng.uniform(0, 1);//vel(h)
        weight[i] = 1.0 / N;
    }
  

Мы использовали следующий конструктор:

явный вектор (size_type n, const value_typeamp; val = value_type(), const allocator_typeamp; alloc = allocator_type());

который создает контейнер с n элементами. Каждый элемент является копией val .(ссылка)

И да, у вас возникли проблемы с предыдущей попыткой из-за того, что встроенный массив объектов Mat не инициализирует их до нужных размеров, что делает конструктор vector.

Комментарии:

1. 1 Но мне интересно, учитывая cv::Mat совершенно странную семантику, получаете ли вы N Mat объектов, использующих один и тот же блок данных.

2. for (int i = 0; i < N; i ) { particle[i] = (Mat_<float>(6, 1) << 0, 0, 0, 0, 0, 0); Я добавил, что это работает.