На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Mix нескольких картинок , OpenGL
    Предыстория:
    микс 2 видео

    В Общем... в OpenGL я не шарю, но вижу придется разбираться.

    Нужно одну картинку (RGB24 буфер) очень быстро наложить на другую (тоже RGB24 буфер).
    Ничего на экран выводить не надо.
    Нет 3D.

    Итак, насколько я знаю, есть разные версии OpenGL.
    В какую сторону смотреть?
    Сообщение отредактировано: Oleg_Smith -
      А зачем OpenGL? Возьми какую-нибудь либу для работы с изображениями и сделай там.
        Пробовал OpenCV.
        Результат лучше, но... есть несколько но...
        Во-первых, в будущем я все таки хочу сделать 3D трансформации.
        Плюс приложение будет конкретно грузить CPU и тут конечно хотелось бы переложить часть работы на GPU.

        В процессе использования OpenCV я видел что можно подключить GPU.
        Но в таком случае надо писать отдельную логику для Cuda и других.

        Думаю, более универсальное решение будет на OpenGL.

        Подготовил небольшой ЮнытТест.
        https://drive.google.com/file/d/0B-NhGVAiTx...dit?usp=sharing

        Этот ЮнитТест позволяет:
        - генерить случайные данные для входных картинок.
        - показывать состояние каждого буфера (выводит содержимое картинки на экран)
        - делает микс 2 картинок прямо в лоб используя CPU
        - делает микс 2 картинок используя OpenCV
        - подсчитывает сколько времени ушло на Микс.
        Все что осталось -- сделать то же самое используя OpenGL.

        Помогите плиз!

        1. Инициализация OpenGL.
        Мне нужна или нет? Я не экран ничего не вывожу.
        2. Из буфера сделать картинку.
        Как?
        3. Ресайз картинки
        4. Наложение катинки в заданное место.

        Спасибо!
          Цитата Oleg_Smith @
          Мне нужна или нет? Я не экран ничего не вывожу.

          А что надо-то? Если выводить не надо, то OpenGL тут не нужен.
            Цитата

            А что надо-то? Если выводить не надо, то OpenGL тут не нужен.


            допустим, есть 2 буфера:

            ExpandedWrap disabled
              BYTE* pPic1 = new BYTE[1920*1080*3];         // 1920x1080 RGB24
              memset(pPic1, 0, 1920*1080*3);               // допустим чорный
               
              BYTE* pPic2 = new BYTE[1920*1080*3];         // 1920x1080 RGB24
              memset(pPic1, 255, 1920*1080*3);             // допустим белый


            Нужно pPic1 наложить на pPiс2

            Типа как PIP в телевизоре...
              Что значит "наложить"? Со смешиванием что-ли? И куда результат записать?
                ну... если так подробно, то тогда....

                допустим так:

                ExpandedWrap disabled
                  BYTE* pPic1 = new BYTE[1920*1080*3];         // 1920x1080 RGB24
                  memset(pPic1, 0, 1920*1080*3);               // допустим черный
                  BYTE* pPic2 = new BYTE[1920*1080*3];         // 1920x1080 RGB24
                  memset(pPic1, 255, 1920*1080*3);             // допустим белый
                  BYTE* pBackground = new BYTE[1920*1080*3];   // 1920x1080 RGB24
                  memset(pPic1, 128, 1920*1080*3);             // допустим серый
                  BYTE* pOutput = new BYTE[1920*1080*3];   // 1920x1080 RGB24
                   
                  // TODO
                  // 1. загрузить картинку для фона из C:\Users\Public\Pictures\Sample Pictures\Desert.jpg
                  for (;;)
                  {
                     // 2. ресайз Desert.jpg + наложить на фон
                     // 3. подсчитать координаты для позиции Pic1
                     // 4. ресайз Pic1 + наложить на фон
                     // 5. подсчитать координаты для позиции Pic2
                     // 6. ресайз Pic2 + наложить на фон
                     // 7. копируем результат в pOutput
                  }


                * "Наложить" -- имеется ввиду нарисовать поверх.

                Типа как тут:
                https://docs.google.com/file/d/0B-NhGVAiTxA...VVwbG1hc28/edit
                Сообщение отредактировано: Oleg_Smith -
                  Ясно. OpenGL в этой задаче не нужен совершенно :)
                    Хммм....
                    А почему?

                    Тоесть тот результат который я получил с OpenCV -- самый лучшый?

                    А если добавить 3D преобразования в наложение?
                    Типа как "нарисовать одну картинку под углом"....
                      Да, и еще, эту процедуру надо делать очень быстро и около 40-50 раз в секунду.

                      Цитата

                      Ясно. OpenGL в этой задаче не нужен совершенно :)


                      Не скрою, немного разочаровал...

                      Дабы успокоить моё я: как по другому разгрузить CPU микса?
                        Цитата Oleg_Smith @
                        А если добавить 3D преобразования в наложение?
                        Типа как "нарисовать одну картинку под углом"....

                        А какая разница? OpenGL предназначен для вывода двух- и трехмерной графики на экран. Преобразованиями изображений занимаются отдельные библиотеки. Не, можно, конечно, воспользоваться PDF_DRAW_TO_BITMAP, но это, имхо, костыль
                        Цитата Oleg_Smith @
                        Дабы успокоить моё я: как по другому разгрузить CPU микса?

                        Написать обработку на GPU :-? Есть ли готовые библиотеки для этого - не в курсе.
                          Существует множество способов как это можно сделать.
                          Давай выделим 2 направления.
                          Сделать средствами CPU или средствами GPU.
                          На CPU всё просто и понятно. Берём библиотеку для работы с растровыми изображениями или пишем свой код.
                          Таких библиотек много стоит только по искать к примеру OpenCV, GDI.
                          Что касаеться GPU, то тут тоже можно использовать библиотеки тот же OpenCV.

                          Как тут говорили OpenGL служит для вывода.
                          Для обработки есть OpenCL, CUDA.

                          На OpenGL тоже можно сделать обработку, но это его не основная задача поэтому настойчиво не рекомендую делать через него.

                          Что касаеться вашей задачи. Простого наложения, то её лучше решать на CPU. В GPU дольше пересылка будет.
                          А вот если захоитте делать более сложную обработку, то GPU будет выигрывать.
                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0290 ]   [ 14 queries used ]   [ Generated: 18.05.24, 12:36 GMT ]