Выделение пиксельных данных в вектор с использованием opencv

У меня есть 3D-вектор и несколько изображений. Я пытаюсь сохранить пиксельные данные изображений в этот вектор. Первый параметр содержит порядковый номер изображения в наборе, а следующие два параметра должны содержать данные о пикселях в (x,y) месте. Учитывая, что я написал следующий код:-

Mat out;// out has an image in it
vector <vector< vector< int> >>  Input_bin;
Input_bin.push_back(vector<vector<int>>(inst_num));// the order number  

for (int i = 0; i <= out.cols; i++)
{

    for (int j = 0; j <= out.rows; j++)
    {
         Input_bin[inst_num].push_back(vector<int>(out.at<int>(i,0)));
         Input_bin[inst_num][out.at<int>(i,0)].push_back(out.at<int>(0,j));
    }
}

Но я получаю ошибку:

Ошибка OpenCV: утверждение не выполнено (dims <= 2 && data && (unsigned)i0 <(unsigned) si ze.p [0] && (unsigned) (i1 * DataType <_Tp>:: channel) <(unsigned) (размер. p [1] * cha nnels ()) && ((((sizeof (size_t) << 28) | 0x8442211) >> ((DataType<_Tp>:: глубина) & ((1 << 3) - 1))*4) & 15) == elemSize1()) в cv::Mat::at, файл C:\opencv_3\opencv\bui ld\include\opencv2/core/mat.inl.hpp, строка 894

и я не могу даже попытаться распечатать результат вектора на экране cmd. Какие-либо предложения?

Редактировать 2- я попробовал другой код, сделав двухмерный вектор input_bin и тип данных float

for (int i = 0; i <= out.cols; i++)
{

    for (int j = 0; j <= out.rows; j++)
    {
        Input_bin[inst_num][out.at<float>(i, j)];
  }}

все та же ошибка

1 ответ

Решение

Предполагая, что ваши изображения имеют тип CV_8UC1одноканальные матрицы intВы можете хранить набор изображений в своей структуре данных следующим образом:

// Your set of images of type CV_8UC1
vector<Mat> set_of_images; 
// How many images?
size_t n_images = set_of_images.size();

// Data structure
vector<vector<vector<uchar>>> input(n_images);

// For each image in the set
for(size_t i=0; i<n_images; ++i)
{
    // Get the corresponding Mat
    const Mat& img = set_of_images[i];

    // Allocate the vectors
    vector<vector<uchar>> vimg(img.rows, vector<uchar>(img.cols));

    // Copy all values from Mat to vimg
    for(int r = 0; r < img.rows; ++r)
    {
        for(int c = 0; c < img.cols; ++c)
        {
            vimg[r][c] = img.at<uchar>(r,c);
        }
    }
    // Copy vimg into the data structure
    input[i] = vimg;
}

Обратите внимание, что если вы знаете, что все изображения в наборе имеют одинаковый размер, вы можете избежать нескольких копий данных.

Также обычно изображения хранятся в непрерывной памяти. Так что вам лучше использовать один vector<uchar> для каждого изображения, с размером img.rows * img.colsи получить к нему доступ, используя индексы вместо (row, col),

Другие вопросы по тегам