У меня возникают некоторые проблемы, связанные с использованием библиотеки boost :: gil, когда я пытаюсь изменить размер изображения. Я хотел бы получить доступ к содержимому пикселей представления изображения после изменения его размера. Тем не менее, я всегда получаю ошибку сегментации при этом.
Вот мой код:
boost::gil::rgb8_image_t rgb_image;
//Try to convert image file to raw binary data
try {
boost::gil::read_and_convert_image("/tmp/image.jpg", rgb_image, boost::gil::jpeg_tag());
} catch (...) {
return;
}
boost::gil::rgb8_view_t rgb_view;
boost::gil::rgb8_image_t rgb_image_resize(150, 200);
boost::gil::resize_view(boost::gil::const_view(rgb_image), boost::gil::view(rgb_image_resize), boost::gil::bilinear_sampler());
rgb_view = boost::gil::view(rgb_image_resize);
for (std::uint32_t i = 0; i < 150; i++) {
boost::gil::rgb8_view_t::x_iterator it_image = rgb_view.row_begin(i);
for (size_t width = 0; width < 200; width++) {
if (it_image->at_c_dynamic(0) * 0.299 + it_image->at_c_dynamic(1) * 0.114 + it_image->at_c_dynamic(2) * 0.587 < 80) {//color filter. Trying to execute this line gives me a seg fault
//do something
} else { //white pixel
//do something
}
it_image++;
}
}
Не могли бы вы указать мне, в чем моя проблема? Если я удаляю функцию resize_view и создаю представление непосредственно из rgb_image, оно работает отлично.
Линия rgb_view.row_begin(i);
дает вам X-навигационный итератор i-th
строка, которую вы можете использовать, чтобы перебрать i-th
пиксели строки.
Но вы увеличиваете этот итератор it_image++;
во вложенном цикле, то есть 150 * 200
раз, что делает его далеко за пределы конца последнего пикселя i-th
строка.
Вот пример, который показывает один из возможных способов достижения правильной итерации:
#include <boost/gil.hpp>
#include <boost/gil/extension/io/jpeg.hpp>
#include <boost/gil/extension/numeric/resample.hpp>
#include <boost/gil/extension/numeric/sampler.hpp>
int main()
{
namespace bg = boost::gil;
bg::rgb8_image_t rgb_image;
bg::read_and_convert_image("/tmp/example/test.jpg", rgb_image, bg::jpeg_tag());
bg::rgb8_image_t rgb_image_resize(68, 49); // rgb_image is 136x98
bg::resize_view(bg::const_view(rgb_image), bg::view(rgb_image_resize), bg::bilinear_sampler());
auto rgb_view = bg::view(rgb_image_resize);
for (int y = 0; y < rgb_view.height(); ++y)
{
bg::rgb8_view_t::x_iterator it_row = rgb_view.row_begin(y);
for (int x = 0; x < rgb_view.width(); ++x)
{
auto p = it_row[x];
if (p.at_c_dynamic(0) * 0.299 + p.at_c_dynamic(1) * 0.114 + p.at_c_dynamic(2) * 0.587 < 80)
; //do something
else
; //do something
}
}
}
Для получения дополнительной информации обратитесь к руководству Boost.GIL с пример вычисления градиента изображения.
ПРИМЕЧАНИЕ. Расширения ввода / вывода были полностью переписаны в Boost.GIL выпущен в Увеличение 1,68. Приведенный выше пример основан на GIL из Boost 1.68.
Других решений пока нет …