выделение данных пикселей в вектор с использованием 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: утверждение не выполнено (затемнение ‹= 2 && data && (без знака) i0 ‹ (без знака) size.p[0] && (без знака) (i1 * DataType‹_Tp>::channels) ‹ (без знака) (size. p[1] * channels()) && ((((sizeof(size_t)‹‹28)|0x8442211) >> ((DataType‹_Tp>::depth) & ((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 двумерным и типом данных с плавающей запятой.

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

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


person Abhishek V. Pai    schedule 05.04.2016    source источник
comment
Можем ли мы увидеть ошибку?   -  person Moreira    schedule 05.04.2016
comment
Ошибка OpenCV: утверждение не выполнено (затемнение ‹= 2 && data && (без знака) i0 ‹ (без знака) size.p[0] && (без знака) (i1 * DataType‹_Tp›::channels) ‹ (без знака) (size. p[1] * channels()) && ((((sizeof(size_t)‹‹28)|0x8442211) ›› ((DataType‹_Tp›::depth) & ((1 ‹‹ 3) - 1)) *4) & 15) == elemSize1()) в cv::Mat::at, файл C:\opencv_3\opencv\bui ld\include\opencv2/core/mat.inl.hpp, строка 894   -  person Abhishek V. Pai    schedule 05.04.2016
comment
out должен быть пустым (ноль строк, ноль столбцов) в вашем примере кода. Где возникает эта ошибка? Цикл не должен быть введен вообще...   -  person Micka    schedule 05.04.2016
comment
Учтите, что в нем есть изображение. Я должен был упомянуть об этом в запросе, извините за это   -  person Abhishek V. Pai    schedule 05.04.2016
comment
если вы на самом деле где-то создаете мат (используйте CV_32SC1, потому что вы используете int), вы пытаетесь получить доступ к мату в неправильном порядке: out.at<int>(i,0) означает ROW i, COLUMN 0, но ваша переменная i зацикливается на столбце, а j зацикливается на строке.   -  person Micka    schedule 05.04.2016
comment
Почему вы хотите хранить значения таким образом?   -  person Miki    schedule 05.04.2016
comment
Кроме того, где ваш набор изображений? Здесь я вижу только одно изображение (out). Какой тип out? CV_8UC3, CV_32SC1, CV_32FC1 или как?   -  person Miki    schedule 05.04.2016
comment
Если я могу понять, как это сделать на одном изображении, то я могу использовать его на наборе изображений, изменив номер заказа. и его CV_8UC1   -  person Abhishek V. Pai    schedule 05.04.2016
comment
вы можете/не должны обращаться к CV_8UC1 как .at<int>(), потому что int является 32-битным со знаком, а не 8-битным без знака. Это приведет к ошибкам доступа (ошибкам сегментации) где-то в изображении, и вы читаете мусорные значения в позициях, где ошибка еще не возникает.   -  person Micka    schedule 05.04.2016


Ответы (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).

person Miki    schedule 05.04.2016