Название: Оптимизация конвертации Отправлено: ecspertiza от Октябрь 11, 2011, 10:20 Как можно оптимизировать следующий код ?
Код: QImage *ResizePreview::nv21torgb(CameraFrame *frame) { этот код конвертирует изображения из nv21 в rgb и работает не сильно шустро 4 - 7 раз в секунду, хотелось бы оптимизировать до 12 -14. что здесь можно изменить? Название: Re: Оптимизация конвертации Отправлено: Igors от Октябрь 11, 2011, 12:40 1) Ну конечно работать с пикселями напрямую вместо setPixel. Учитывая что число байт в строке может быть больше числа пикселей * размер пикселя, надо использовать scanLine. Полагается что выходной имедж 32 бита на пиксель (ну может 24). Для остальных (редко используемых) - то что сейчас
2) Объявление int r, g, b ощутимо снижает качество, а скорость сильно не поднимает. Лучше считать все во float, а также добавить бухгалтерское округление Edit: at тоже (возможно) что-то отгрызает, лучше взять (const char *) - стоить проверить. Название: Re: Оптимизация конвертации Отправлено: ecspertiza от Октябрь 11, 2011, 14:25 насчет r,g,b уже пробовал разницу почти не заметил, тоже с const char*. А вот как работать с пикселями напрямую ? я то думал что setPixel - это напрямую :)
Название: Re: Оптимизация конвертации Отправлено: BRE от Октябрь 11, 2011, 15:41 насчет r,g,b уже пробовал разницу почти не заметил, тоже с const char*. А вот как работать с пикселями напрямую ? я то думал что setPixel - это напрямую :) Картинка храниться в одном непрерывном куске памяти как последовательность точек, строка за строкой, начиная с верхней, слева направо.Ты задал формат QImage::Format_ARGB32, значит каждая точка будет состоять из 4 байт в порядке: Alpha, Red, Green, Blue. Начало этого возвращает метод: uchar * QImage::bits () Метод setPixel каждый раз будет вычислять позицию в буфере, а вместо этого можно двигаться по этому буферу последовательно и не чего не вычислять. ;) Название: Re: Оптимизация конвертации Отправлено: Igors от Октябрь 11, 2011, 17:19 Код: for (int j = 0, yp = 0; j < height; ++j) { |