Sws_scale YUV --> изображение с искажением RGBC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Sws_scale YUV --> изображение с искажением RGB

Сообщение Anonymous »

Я хочу преобразовать изображение YUV420P (полученное из потока H.264) в RGB, а также изменить его размер, используя sws_scale.

Размер исходного изображения — 480 × 800. Простое преобразование с теми же размерами работает нормально.

Но когда я пытаюсь изменить размеры, я получаю искаженное изображение со следующим шаблоном:
  • изменение размера на 481 × 800 приведет к искажению черно-белого изображения, которое будет выглядеть так, как будто оно обрезано посередине.
  • 482 × 800 будет еще больше искажен
  • 483 × 800 искажен, но цветной
  • 484 × 800 в порядке (масштабируется правильно).
Теперь следует следующий шаблон: масштабирование будет работать нормально, только если разница между делениями на 4.

Вот пример кода декодирования и преобразования изображения. Все методы показывают «успех».

int srcX = 480;
int srcY = 800;
int dstX = 481; // or 482, 483 etc
int dstY = 800;

AVFrame* avFrameYUV = avcodec_alloc_frame();
avpicture_fill((AVPicture *)avFrameYUV, decoded_yuv_frame, PIX_FMT_YUV420P, srcX , srcY);

AVFrame *avFrameRGB = avcodec_alloc_frame();

AVPacket avPacket;
av_init_packet(&avPacket);
avPacket.size = read; // size of raw data
avPacket.data = raw_data; // raw data before decoding to YUV

int frame_decoded = 0;
int decoded_length = avcodec_decode_video2(g_avCodecContext, avFrameYUV, &frame_decoded, &avPacket);
int size = dstX * dstY * 3;

struct SwsContext *img_convert_ctx = sws_getContext(srcX, srcY, SOURCE_FORMAT, dstX, dstY, PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);

avpicture_fill((AVPicture *)avFrameRGB, rgb_frame, PIX_FMT_RGB24, dstX, dstY);
sws_scale(img_convert_ctx, avFrameYUV->data, avFrameYUV->linesize, 0, srcY, avFrameRGB->data, avFrameRGB->linesize);

// draws the resulting frame with windows BitBlt
DrawBitmap(hdc, dstX, dstY, rgb_frame, size);

sws_freeContext(img_convert_ctx);


Подробнее здесь: https://stackoverflow.com/questions/849 ... rted-image
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»