muslaev.ilya Posted March 4, 2021 Share Posted March 4, 2021 (edited) Добрый Вечер! уже целый месяц не могу через программирование преобразовать изображении RGB8 после рендер с неподвижной камеры на jpeg. какие пути и способы программировать преобразование с RGB на JPEG? Благодарю Edited March 4, 2021 by muslaev.ilya Link to comment
silent Posted March 4, 2021 Share Posted March 4, 2021 muslaev.ilya А можете показать код который у вас сейчас используется? Что значит "RGB8 после рендера"? Спасибо. 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
muslaev.ilya Posted March 5, 2021 Author Share Posted March 5, 2021 (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 March 5, 2021 by muslaev.ilya Link to comment
muslaev.ilya Posted March 5, 2021 Author Share Posted March 5, 2021 или другой код 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 comment
sweetluna Posted March 5, 2021 Share Posted March 5, 2021 Я пологаю тип у 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. Спасибо. May RenderDoc/Nsight Graphics/Intel GPA bless you Link to comment
muslaev.ilya Posted March 5, 2021 Author Share Posted March 5, 2021 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 comment
muslaev.ilya Posted March 5, 2021 Author Share Posted March 5, 2021 (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 March 5, 2021 by muslaev.ilya Link to comment
muslaev.ilya Posted March 9, 2021 Author Share Posted March 9, 2021 кто нибудь подскажете? Link to comment
sweetluna Posted March 9, 2021 Share Posted March 9, 2021 Советую заменить тип 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 May RenderDoc/Nsight Graphics/Intel GPA bless you Link to comment
muslaev.ilya Posted March 11, 2021 Author Share Posted March 11, 2021 Благодарю Вопрос закрыт Link to comment
Recommended Posts