Russian Qt Forum
Ноябрь 23, 2024, 04:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt + OpenGL: Компонент для просмотра изображений для сканирующего комплекса.  (Прочитано 5189 раз)
cerbere
Гость
« : Декабрь 21, 2016, 00:04 »

Требования к компоненту для просмотра изображений для сканирующего комплекса.
Для работы с изображением полученным в результате сканирования требуется разработать компонент для среды Qt (сейчас используется версия 5.6.2). Под компонентом подразумевается класс наследник QWidget, который можно встроить в интерфейс программы. Для хорошей отзывчивости интерфейса предполагается использование OpenGL. Желательно использовать OpenGL ES 3.0 или 2.0 и по возможности максимально использовать средства Qt для упрощения дальнейшего сопровождения и портирования кода.
В глобальном смысле у компонента предполагаются следующие режимы работы:
•   Отображение статической картинки
•   Отображение текущей сканируемой картины по мере ее получения
•   Навигация при работе с коллекцией полученный ранее изображений
•   Отображение непрерывного потока получаемых изображений.
Отображение статической картинки
Отображение статической картинки с возможностью увеличения части картинки для рассматривания деталей и панорамирования рассматриваемой зоны. Должна быть предусмотрена возможность плавного увеличения картинки и панорамирования, активируемая отдельной настройкой.
В данном режиме также нужно иметь возможность пересчета координат пикселя на экране в координаты точки просматриваемого изображения. Данная возможность необходима для реализации маркерных измерений. Сейчас это реализуется с помощью переопределения QWidget::mouseMoveEvent() и отслеживание текущих координат указателя мыши при зажатой правой кнопке мыши и последующим пересчетом этих экранных координат в координаты изображения.
Для данного режима предлагается использовать следующий интерфейс:
public slots:
   void showImage(QImage image);
   void zoom(float zoomLevel);
   void pan(float addX, float addY);
   void fitToWindow();
   void enableSmoothZoom(bool enable);
   void enableSmoothPan(bool enable);

signals:
   void showToolTip(QPoint pos, int x, int y);
   void zoomLevelChanged(float zoomLevel);
Метод showImage(QImage image) переводит компонент в режим отображения статической картинки и задает изображение для отображения, при этом текущие настройки зуммирования и панорамирования остаются неизменными.
Метод zoom(float zoomLevel) задает новый уровень зуммирования, при этом значение zoomLevel 1.0 соответствует отображению текущей картинки на всю область компонента, значения больше 1.0 соответствует увеличению изображения. Зуммирование происходит с сохранение пропорций выводимого изображения.
Метод pan(int direction) позволяет панорамировать изображение, при этом параметр addX задает смещение центра видимой области по оси X в пикселях отображаемой картинки, addY — смещение по оси Y.
Метод fitToWindow() сбрасывает текущие настройки зуммирования и панорамирования и отображает всю картинку целиком (zoomLevel = 1.0) по центру видимой области компонента.
Метод enableSmoothZoom(bool enable) включает или выключает плавную анимацию процесса зуммирования.
Метод enableSmoothPan(bool enable) включает или выключает плавную анимацию процесса панорамирования.
Сигнал showToolTip(QPoint pos, int x, int y) сообщает о необходимости провести какие либо маркерные измерения, параметр pos сообщает координаты точки на экране, параметры x и y сообщают координаты соответствующие точке в исходной отображаемой картинке.
Сигнал zoomLevelChanged(float zoomLevel) сообщает об изменении текущего уровня зуммирования.
Для QImage предполагается всегда использовать формат Qimage::Format_RGBA8888.
Отображение текущей сканируемой картины по мере ее получения
При сканировании багажа, по мере продвижения багажа через плоскость сканирования на лету формируется картинка и столбец за столбцом отдается компоненту для отображения и оператор видит как изображение багажа «въезжает» на экран слева или справа в зависимости от настройки отображения. Для случая сканирования в вертикальном направлении изображение постепенно прорисовывается построчно сверху-вниз или снизу вверх в зависимости от настроек отображения.
Для данного режима предлагается использовать следующий интерфейс:
enum class ImageOrientation {
   Portrait,
   Landscape,
};
enum class ScanDirection {
   BeginToEnd,
   EndToBegin,
};
public slots:
   void startDynImage(int w, int h, ImageOrientation io,                      ScanDirection sd);
   void newDynImageLines(QImage lines, int linesDone);
Перечисления ImageOrientation и ScanDirection необходимы для описания как из отдельных строк собирается изображение.
Метод startDynImage(int w, int h, ImageOrientation io, ScanDirection sd) переводит компонент в режим отображения текущей сканируемой картинки по мере ее получения и задает все необходимые начальные данные. ImageOrientation io задает ориентацию получаемого изображения:
•   ImageOrientation::Portrait задает вертикальную ориентацию получаемого изображения и получаемое изображение будет формироваться построчно строка за строкой сверху-вниз (ScanDirection::BeginToEnd) или снизу-вверх (ScanDirection::EndToBegin), при этом получаемое изображение остается неподвижным и просто построчно прорисовывается.
•   ImageOrientation::Landscape задает горизонтальную ориентацию получаемого изображения и получаемое изображение будет формироваться по столбцам, столбец за столбцом слева-направо (ScanDirection::BeginToEnd) или справа-налево (ScanDirection::EndToBegin), при этом получаемое изображение «въезжает» на экран с соответствующей стороны.
Метод newDynImageLines(QImage lines, int linesDone) передают набор очередных строк или столбецов получаемого изображения, lineы всегда является горизонтально ориентированным изображением высотой в N пикселей и шириной w для режима ImageOrientation::Portrait или h для режима ImageOrientation::Landscape.
Навигация при работе с коллекцией полученный ранее изображений
При работе с коллекцией полученных ранее изображений нужна возможность «пролистывания» изображений, при котором новое изображение «въезжает» на экран слева или справа и заменяет предыдущее изображение. Данный режим наверное является частью первого режима, отображения статической картинки.
Для данного режима предлагается использовать следующий интерфейс:
enum class SlideDirection {
   RightToLeft,
   LeftToRight,
};
public slots:
   void slideImage(QImage newImage, SlideDirection sd);
Метод slideImage(QImage newImage, SlideDirection sd) задает новое изображение newImage которым надо заменить текущее отображаемое изображение при этом новое изображение должно заменить старое «въехав» на экран справа на лево (SlideDirection::RightToLeft) или слева на право (SlideDirection::LeftToRight).
Отображение непрерывного потока получаемых изображений
Данный режим необходим для отображения непрерывного потока сканирования, который принципиально не ограничен по длительности во времени. В данном режиме поток изображения представляет из себя «водопад», новые столбцы изображения появляются с одной стороны экрана и исчезают с противоположной. Предполагается только горизонтальный «водопад».
Для данного режима предлагается использовать следующий интерфейс:
public slots:
   void beginWaterfall(int w, int h);
   void newWaterfallLines(QImage lines, SlideDirection sd);
Метод beginWaterfall(int w, int h) переводит компонент в режим отображения непрерывного потока получаемых изображений. Параметры  и  задают ширину и высоту формируемой картинки, при этом они не обязательно совпадают с размерами области вывода компонента.
Метод newWaterfallLines(QImage lines, SlideDirection sd) передает новую порцию столбцов изображения lines шириною w и высотою N пикселей, т. е. lines всегда горизонтально ориентированное изображение. При этом если параметр sd задан как  SlideDirection::RightToLeft, то новые N столбцов появляются справа, все изображение сдвигается влево и слева исчезает N столбцов. Если же параметр sd задан как  SlideDirection::LeftToRight, то все происходит в обратном направлении.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Декабрь 21, 2016, 09:14 »

серьёзно? Копипаста ТЗ фрилансера?  Смеющийся Смеющийся Смеющийся
Записан
cerbere
Гость
« Ответ #2 : Декабрь 21, 2016, 12:36 »

серьёзно? Копипаста ТЗ фрилансера?  Смеющийся Смеющийся Смеющийся

Да. Это копипаст с fl.ru. Это моё задание... и в целях привлечения большей аудитории запостил и сюда.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 21, 2016, 13:01 »

А что из себя представляют сами данные? Каков объем напр столбца из 100 пикселей? Что вообще должно рисоваться?
Записан
cerbere
Гость
« Ответ #4 : Декабрь 21, 2016, 13:15 »

А что из себя представляют сами данные? Каков объем напр столбца из 100 пикселей? Что вообще должно рисоваться?

Это изображения => объём как у jpeg такого размера
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 21, 2016, 13:21 »

Это изображения => объём как у jpeg такого размера
Ну если это просто "пиксели" - то особого резона в OpenGL не видно
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.085 секунд. Запросов: 22.