Я работаю с изображениями на C++ с OpenCV.Как заполнить массив Vec3b
Я написал код с массивом uchar двух измерений, где я могу читать значения пикселей изображения, загруженные с imread в оттенках серого, используя .at< uchar>(i,j)
.
Однако я хотел бы сделать то же самое для цветных изображений. Поскольку я знаю, что для доступа к значениям пикселей мне теперь нужны .at< Vec3b>(i,j)[0]
, .at< Vec3b>(i,j)[1]
и .at< Vec3b>(i,j)[2]
, я сделал аналогичные массивы Vec3b
2d.
Но я не знаю, как заполнить этот массив значениями пикселей. Он должен быть двумерным массивом.
Я пробовал:
array[width][height].val[0]=img.at< Vec3b>(i,j)[0]
, но это не сработало.
Не нашли ответа на документ OpenCV или нет ни здесь.
У кого-нибудь есть идея?
Я включил часть своего кода. Мне нужен массив, потому что у меня уже есть весь алгоритм, работающий с использованием массива, для изображений в оттенках серого только с одним каналом.
Серая шкала код так:
for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
image_data[i*width+j]=all_images[nb_image-1].at< uchar>(i,j);
}
}
Где читать:
std::vector< cv::Mat> all_images
каждое изображение (я имею длинную последовательность), извлекает значения пикселя в массиве Uchar image_data
, и обрабатывает их.
Теперь я хочу сделать то же самое, но для изображений RGB, и я не могу прочитать пиксель данных каждого канала и поместить их в массив.
На этот раз image_data является массив Vec3b, и код, который я пытаюсь выглядит так:
for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
image_data[0][i*width+j]=all_images[nb_image-1].at<cv::Vec3b>(i,j)[2];
image_data[1][i*width+j]=all_images[nb_image-1].at<cv::Vec3b>(i,j)[1];
image_data[2][i*width+j]=all_images[nb_image-1].at<cv::Vec3b>(i,j)[0];
}
}
Но это не работает, так что теперь я в догадках, я не знаю, как успешно заполнить массив image_data
значениями всех трех каналов без изменения структуры кода, так как этот массив используется в моем алгоритме обработки изображений.
Erf, к сожалению, он по какой-то причине не работает с моим кодом. Я не очень хочу публиковать его здесь, поэтому я разрешу свою проблему, найдя другой путь. Спасибо за помощь, но ваше решение действительно работает, поэтому я проверю его. – George
, хотя я считаю, что он должен быть (int) tmp [0] not (int) tmp (0) (и т. Д.) – George
В официальной документации opencv оператор (int) реализован для матрицы строк cv :: Matx. cv :: Vec3b получен из cv :: Matx. – Eric