Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.125.109] |
|
Сообщ.
#1
,
|
|
|
Предыстория:
микс 2 видео В Общем... в OpenGL я не шарю, но вижу придется разбираться. Нужно одну картинку (RGB24 буфер) очень быстро наложить на другую (тоже RGB24 буфер). Ничего на экран выводить не надо. Нет 3D. Итак, насколько я знаю, есть разные версии OpenGL. В какую сторону смотреть? |
Сообщ.
#2
,
|
|
|
А зачем OpenGL? Возьми какую-нибудь либу для работы с изображениями и сделай там.
|
Сообщ.
#3
,
|
|
|
Пробовал 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. Наложение катинки в заданное место. Спасибо! |
Сообщ.
#4
,
|
|
|
Цитата Oleg_Smith @ Мне нужна или нет? Я не экран ничего не вывожу. А что надо-то? Если выводить не надо, то OpenGL тут не нужен. |
Сообщ.
#5
,
|
|
|
Цитата А что надо-то? Если выводить не надо, то OpenGL тут не нужен. допустим, есть 2 буфера: 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 в телевизоре... |
Сообщ.
#6
,
|
|
|
Что значит "наложить"? Со смешиванием что-ли? И куда результат записать?
|
Сообщ.
#7
,
|
|
|
ну... если так подробно, то тогда....
допустим так: 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 |
Сообщ.
#8
,
|
|
|
Ясно. OpenGL в этой задаче не нужен совершенно
|
Сообщ.
#9
,
|
|
|
Хммм....
А почему? Тоесть тот результат который я получил с OpenCV -- самый лучшый? А если добавить 3D преобразования в наложение? Типа как "нарисовать одну картинку под углом".... |
Сообщ.
#10
,
|
|
|
Да, и еще, эту процедуру надо делать очень быстро и около 40-50 раз в секунду.
Цитата Ясно. OpenGL в этой задаче не нужен совершенно Не скрою, немного разочаровал... Дабы успокоить моё я: как по другому разгрузить CPU микса? |
Сообщ.
#11
,
|
|
|
Цитата Oleg_Smith @ А если добавить 3D преобразования в наложение? Типа как "нарисовать одну картинку под углом".... А какая разница? OpenGL предназначен для вывода двух- и трехмерной графики на экран. Преобразованиями изображений занимаются отдельные библиотеки. Не, можно, конечно, воспользоваться PDF_DRAW_TO_BITMAP, но это, имхо, костыль Цитата Oleg_Smith @ Дабы успокоить моё я: как по другому разгрузить CPU микса? Написать обработку на GPU Есть ли готовые библиотеки для этого - не в курсе. |
Сообщ.
#12
,
|
|
|
Существует множество способов как это можно сделать.
Давай выделим 2 направления. Сделать средствами CPU или средствами GPU. На CPU всё просто и понятно. Берём библиотеку для работы с растровыми изображениями или пишем свой код. Таких библиотек много стоит только по искать к примеру OpenCV, GDI. Что касаеться GPU, то тут тоже можно использовать библиотеки тот же OpenCV. Как тут говорили OpenGL служит для вывода. Для обработки есть OpenCL, CUDA. На OpenGL тоже можно сделать обработку, но это его не основная задача поэтому настойчиво не рекомендую делать через него. Что касаеться вашей задачи. Простого наложения, то её лучше решать на CPU. В GPU дольше пересылка будет. А вот если захоитте делать более сложную обработку, то GPU будет выигрывать. |