конвертация RGB8 to JPEG программирование С++


photo

Recommended Posts

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

уже целый месяц не могу через программирование преобразовать изображении RGB8 после рендер с неподвижной камеры на jpeg.
какие пути и способы программировать преобразование с  RGB на JPEG?

Благодарю

Edited by muslaev.ilya
Link to post

muslaev.ilya

А можете показать код который у вас сейчас используется? Что значит "RGB8 после рендера"?

Спасибо.

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to post
Posted (edited)

код

                std::uint8_t* buff_img;
                buff_img = camControl->getBuffer(1);//получаем адрес из Image Unigine::Image::getPixels()
                if (buff_img) {
                    AVPicture dst_picture;
                    avpicture_alloc(&dst_picture, AV_PIX_FMT_YUV420P, w2, h2);

                    SwsContext* ctx = sws_getContext(
                        w1, h1, AV_PIX_FMT_RGB32,
                        w2, h2, AV_PIX_FMT_YUV420P,
                        0, 0, 0, 0); 
                    std::uint8_t* inData[1] = { buff_img };// RGB24 have one plane
                    int inLiunesize[1] = { 4 * w1 }; // RGB stride
                    sws_scale(ctx, inData, inLiunesize, 0, w1, dst_picture.data, dst_picture.linesize);
                    std::string bufferJPG;
                    std::uint8_t* pixels = reinterpret_cast<std::uint8_t*>(dst_picture.data[0]);
                    int buf_size = w2 * h2 * 1;// 4;// 3;
                    std::size_t size = buf_size;
                    std::unique_lock<std::mutex> lock(m_Locker);
                    for (int i = 0; i < size; i++) {
                        bufferJPG.push_back(pixels[i]);// на этом место все время вылетает точнее зависает ПО
                    }
                    buffer = httplib::detail::base64_encode(bufferJPG);
                    lock.unlock();
                    res.set_content(buffer, "image/jpeg");

 

на консоле выдает но это ошибка касается только библиотека ffmpeg

[swscaler @ 0000014ed4dc00c0] Slice parameters 0, 800 are invalid

Edited by muslaev.ilya
Link to post

или другой код

        Unigine::ImagePtr m_BufferImg[2];

        ......

        std::unique_lock<std::mutex> lock(m_Locker);
        int check = retImagePtr->copy(m_BufferImg[m_bufIdx], 0, 0, 0, 0, m_img_w, m_img_h);
        lock.unlock();

в консоле выдает 

Image::copy(): image is not loaded

Link to post

Я пологаю тип у bufferJPG - std::vector? Попробуйте перед циклом вызвать reserve(buf_size). И что именно происходит тут?

for (int i = 0; i < size; i++) {
    bufferJPG.push_back(pixels[i]);// на этом место все время вылетает точнее зависает ПО
}

 

Quote

Image::copy(): image is not loaded

Это означает, что Image (либо retImagePtr, либо m_BufferImg[m_bufIdx]) не был загружен (нет данных). Используйте create2D.

 

Спасибо.

Link to post
1 hour ago, sweetluna said:

Я пологаю тип у bufferJPG - std::vector? Попробуйте перед циклом вызвать reserve(buf_size). И что именно происходит тут?


for (int i = 0; i < size; i++) {
    bufferJPG.push_back(pixels[i]);// на этом место все время вылетает точнее зависает ПО
}

 

Это означает, что Image (либо retImagePtr, либо m_BufferImg[m_bufIdx]) не был загружен (нет данных). Используйте create2D.

 

Спасибо.

bufferJPG  это std::string 

уже инициализирован и создан

    m_BufferImg[0] = Image::create();
    m_BufferImg[1] = Image::create();
    m_BufferImg[0]->create2D(w, h, Image::FORMAT_RGBA8);
    m_BufferImg[1]->create2D(w, h, Image::FORMAT_RGBA8);
 

 

 

Link to post
Posted (edited)

проблема в том что 

std::uint8_t* pixels = reinterpret_cast<std::uint8_t*>(dst_picture.data[0]);

адрес получил,  а дальше скопировать содержимое pixels[i] на bufferJPG.push_back();

во время работы толи постоянно зависает, то ли выдает на консоле

[swscaler @ 0000014ed4dc00c0] Slice parameters 0, 800 are invalid

Edited by muslaev.ilya
Link to post

Советую заменить тип bufferJPG с std::string на, хотя бы, std::vector<uint8_t> и перед циклом вызвать reserve(buf_size).
При каждом вызове push_back, если не хватает, аллоцируется память размером в два раза превышающую текущую. Это может быть причиной зависаний.

С swscaler не имел дела, но думаю можно поискать в справке для ffmpeg или libswscale.

Quote

[swscaler @ 0000014ed4dc00c0] Slice parameters 0, 800 are invalid

Для начала, нашел такое:
https://stackoverflow.com/questions/59778299/ffmpeg-sws-scale-returns-error-slice-parameters-0-2160-are-invalid

Link to post