mihail.litvinov Posted November 17, 2022 Share Posted November 17, 2022 Добрый вечер! Столкнулся с такой проблемой конвертирую Image в QImage void Coder::slot_makeScreen() { m_worldLogic->grab(); int height = m_worldLogic->getImage().get()->getHeight(); int weight = m_worldLogic->getImage().get()->getWidth(); if ( m_worldLogic->getImage().get()->getSize() <= 4) return; QImage image(weight, height, QImage::Format_RGB32); memcpy(m_worldLogic->getImage().get()->getPixels2D() , image.bits() , m_worldLogic->getImage().get()->getSize()); emit signal_picture(image); } и картинка отображается со странными цветами ? может сталкивались с такой штукой , temporary_texture = Render::getTemporaryTexture2D(window->getSize().x, window->getSize().y, Texture::FORMAT_RGB8); //Texture::FORMAT_RGB8 temporary_texture->copy2D(); Спасибо! Link to comment
silent Posted November 17, 2022 Share Posted November 17, 2022 А для чего это делать? Есть какая-то конкретная задача? How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
mihail.litvinov Posted November 18, 2022 Author Share Posted November 18, 2022 (edited) Задача получить буфер экрана (камеры) и отправить его дальше по сети Тут вопрос в том что возможно хранятся байты в другом порядке скорей всего ;) (что-то типа как устроенно в opencv ... ) по чему перевернуто (текстура перевернута это нормальное для нее состояние, это найду) кстати скриншот если image в jpg сохранить то он нормально выглядит ... Edited November 18, 2022 by mihail.litvinov Link to comment
victor Posted November 18, 2022 Share Posted November 18, 2022 Здравствуйте, Михаил, 18 hours ago, mihail.litvinov said: m_worldLogic->getImage() А в каком формате Image ? Попробуйте вот такой код, всё ли будет корректно отображаться? ImagePtr converted_image = m_worldLogic->getImage(); if (converted_image->getFormat() != Image::FORMAT_RGBA8) { converted_image = Image::create(); converted_image->assignFrom(image); if (!converted_image->convertToType(Image::IMAGE_2D) || !converted_image->convertToFormat(Image::FORMAT_RGBA8)) { Log::warning("Cannot convert 'image' to RGBA8\n"); return; } } QImage image(converted_image->getPixels(), converted_image->getWidth(), converted_image->getHeight(), converted_image->getStride(), QImage::Format_RGBA8888); emit signal_picture(image); Link to comment
mihail.litvinov Posted November 18, 2022 Author Share Posted November 18, 2022 (edited) Спасибо! верхний вариант не отработал (( вот такой нормально отработал: ImagePtr converted_image = m_worldLogic->getImage(); m_image = QImage(converted_image->getPixels(), converted_image->getWidth(), converted_image->getHeight(), QImage::Format_RGB888).copy(); emit signal_picture(m_image); вариант c memcopy отработал и даже он кажеться быстрее но там, у меня не срабатывал формат QImage::Format_RGB888 работает с форатом QImage::Format_RGBX8888 или QImage::Format_RGBA8888, но нам приходит из текстуры 3 канал, и подглючивает (надо подумать) QImage image(weight, height, QImage::Format_RGBX8888); memcpy(m_worldLogic->getImage().get()->getPixels2D(), image.bits(), m_worldLogic->getImage().get()->getSize()); я сейчас рендерю экран в текстуру, и дальше отправляю картинку, по аналогии с примером screenshot но возможно есть более быстрый способ получения буфера? CALLBACK_END_SWAP - это событие переключения буферов, правильно ли я понимаю? как бы лучше кидать событие в готово, может есть стандартная практика? Edited November 18, 2022 by mihail.litvinov Link to comment
silent Posted November 19, 2022 Share Posted November 19, 2022 Quote но возможно есть более быстрый способ получения буфера? Задача сама по себе требует комплексного подхода и с наскоку не решается. Самый быстрый способ будет с DMA и Quadro-картами (GPUDirect), где можно минуя CPU получать изображение из GPU и сразу по PCI-E отправлять по сети. Если нет таких карточек можно посмотреть в сторону CUDA (есть сэмпл для Windows, возможно его получится завести и на Linux): SDK Browser -> Samples -> 3rd Party -> nVidia. Ну и получать каждый раз с GPU RGB несжатые изображения очень накладно (и по объему данных которые нужно передать в том числе). Возможно, если прикрутить какую-нибудь библиотеку для реалтайм-кодирования из текстур в видео и отправлять это видео по сети (минуя Qt в том числе), то можно будет избежать значительных просадок в производительности. Вообще про получение и копирование из GPU в CPU память можно применять подходы из этого обсуждения: How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
Recommended Posts