Jump to content

Image to QImage = проблема с цветом


photo

Recommended Posts

Добрый вечер!

Столкнулся  с такой проблемой конвертирую 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();

Спасибо!

 

 

 

 

Screenshot_20221117_195409.png

Link to comment

Задача получить буфер экрана (камеры) и отправить его дальше по сети 

Тут вопрос в том что возможно хранятся байты в другом порядке скорей всего ;) (что-то типа как устроенно в opencv ... )

по чему перевернуто (текстура перевернута это нормальное для нее состояние, это найду) кстати

скриншот если image в jpg сохранить то он нормально выглядит ...

 

Edited by mihail.litvinov
Link to comment

Здравствуйте, Михаил,

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

Спасибо!

верхний вариант не отработал ((

вот такой нормально отработал:

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 by mihail.litvinov
Link to comment
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:

Link to comment
×
×
  • Create New...