Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: ShiroExorcist от Февраль 13, 2017, 22:01



Название: Динамические массивы для хранения изображений
Отправлено: ShiroExorcist от Февраль 13, 2017, 22:01
Добрый вечер! При реализации задачи по обработке двух пар изображений разрешением 640х480 появилась необходимость увеличить поля изображение на половину матрицы свёртки, написал три простые функции для этого. Конечное монохромное изображение хранится в трёх динамических двумерных массивах. И вот возникла проблема при таком разрешении изображений и матрице размером 30х30 программа иногда вылетает с кодом завершения 255. С небольшими изображениями программа работает стабильно, как можно решить проблему? Версия Qt 5.6.2 (MinGW 4.9.2).


Название: Re: Динамические массивы для хранения изображений
Отправлено: Racheengel от Февраль 13, 2017, 22:04
запустить в отладчике, глянуть, где вылетело?


Название: Re: Динамические массивы для хранения изображений
Отправлено: ShiroExorcist от Февраль 13, 2017, 22:20
отладчик ни чего не выдаёт, программа тупо вылетает


Название: Re: Динамические массивы для хранения изображений
Отправлено: ShiroExorcist от Февраль 13, 2017, 23:51
запустить в отладчике, глянуть, где вылетело?
Удалось поймать ошибку. Выдаёт sigsegv segmentation fault на строке

leftLbl->setPixmap(QPixmap::fromImage(img));


Название: Re: Динамические массивы для хранения изображений
Отправлено: Пантер от Февраль 14, 2017, 08:10
leftLbl существует?


Название: Re: Динамические массивы для хранения изображений
Отправлено: ShiroExorcist от Февраль 14, 2017, 08:20
Да leftLbl существует и программа работает с изображениями меньшими по разрешению, правда иногда тоже вылетает


Название: Re: Динамические массивы для хранения изображений
Отправлено: gil9red от Февраль 14, 2017, 08:58
А c img ничего плохого не происходит?

Добавьте логирование img перед leftLbl->setPixmap(QPixmap::fromImage(img)); (а лучше везде поставить логирование)



Название: Re: Динамические массивы для хранения изображений
Отправлено: ShiroExorcist от Февраль 14, 2017, 09:27
В img записываются значения от 0 до 255, потом оно записывается в label
Отладчик пишет, что ошибка в Z29qt_convert_rgb888_to_rgbx8888PjPKhi


Название: Re: Динамические массивы для хранения изображений
Отправлено: gil9red от Февраль 14, 2017, 09:35
Интересная функция вызывается: qt_convert_rgb888_to_rgbx8888

Покажите конструктор, вызываемый для img



Название: Re: Динамические массивы для хранения изображений
Отправлено: ShiroExorcist от Февраль 14, 2017, 09:59
QImage img(tempLeft, Wmax, Hmax, Wmax, QImage::Format_Indexed8);

QVector <QRgb> color_table;
For(int i=0; i<256; i++)
    color_table.append(qRgb(i,i,i));
img.setColorTable(color_table);

tempLeft одномерный массив хранящий интенсивность


Название: Re: Динамические массивы для хранения изображений
Отправлено: gil9red от Февраль 14, 2017, 10:59
Приложите тогда, пожалуйста, минимальный проект с проблемой


Название: Re: Динамические массивы для хранения изображений
Отправлено: Igors от Февраль 14, 2017, 11:48
При реализации задачи по обработке двух пар изображений разрешением 640х480 появилась необходимость увеличить поля изображение на половину матрицы свёртки, написал три простые функции для этого. Конечное монохромное изображение хранится в трёх динамических двумерных массивах.
Матрица свертки - а что это? Монохромное изображение - ну наверное пыксель может быть только 0 или 1. Тогда зачем хранить его в 3 динамических двумерных? И кто такие эти "массивы" - какие контейнеры?

Ой, наверное всем остальным все это понятно, ведь они не задают таких вопросов  :)


Название: Re: Динамические массивы для хранения изображений
Отправлено: ShiroExorcist от Февраль 14, 2017, 11:53
Матрица свёртки это изображение которое будет умножаться на пиксели исходных изображений.
Монохромное изображение тоесть изображение в оттенках серого от 0 до 255, левое изображение в оттенках серого в одном массиве, правое в другом, а в третьем сама матрица свёртки.


Название: Re: Динамические массивы для хранения изображений
Отправлено: ShiroExorcist от Февраль 14, 2017, 13:26
В архиве, помимо проекта, два изображения LM1 и m1, LM1 необходимо загрузить как правое и левое изображение, m1  матрица свёртки. Как только в диалоге выбирается матрица свёртки происходит выполнение функций, переводящих изображения в оттенки серого. Программа не всегда вылетает с ошибкой, для 100% получения ошибки необходимо в качестве свёртки загрузить так же LM1 вместо m1.


Название: Re: Динамические массивы для хранения изображений
Отправлено: Racheengel от Февраль 14, 2017, 19:06
"изображение в оттенках серого от 0 до 255" - это уже не монохромное, это 256 цветов :)

По коду сложно что-то сказать (он Write Only), но скорее всего, у Вас банально вылет за границу массива в одном из if-циклов. Дебагать надо.


Название: Re: Динамические массивы для хранения изображений
Отправлено: ShiroExorcist от Февраль 14, 2017, 19:45
https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BD%D0%BE%D1%85%D1%80%D0%BE%D0%BC%D0%BD%D0%BE%D0%B5_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5
С термином монохромный не так всё просто, я подразумевал полутоновое изображение.
Вообще с одним и тем же изображением она может как работать, так и вылетать, но гарантировано вылетает при большом размере матрицы.


Название: Re: Динамические массивы для хранения изображений
Отправлено: ShiroExorcist от Февраль 15, 2017, 16:46
С проблемой разобрался, не стоило в вызове методе setPixmap создавать объект типа QPixmap.
Проблема была решена созданием объекта QPixmap до передачи в лейбл,  при старом варианте всё падало из-за повторного вызова конструктора при работе метода setPixmap.
Спасибо за советы :)