Выделение пиксельных данных в вектор с использованием 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)
,