sws_scale gray->float:我做错了什么?

问题描述

我正在尝试将 gray8 格式的帧转换为 grayf32 和 gbrpf32 格式。下面的代码适用于 grayf32 但不适用于 gbrpf32。我在下面的代码中做错了什么?

AVFrame* gray = av_frame_alloc();
gray->format = AV_PIX_FMT_GRAY8;
gray->width = 4;
gray->height = 1;
gray->color_range = AVCOL_RANGE_JPEG;
av_frame_get_buffer(gray,0);

uint8_t grayVals[4] = { 0,85,170,255 };
memcpy(gray->data[0],grayVals,4);

AVFrame* floatGray = av_frame_alloc();
floatGray->format = AV_PIX_FMT_GRAYF32;
floatGray->width = gray->width;
floatGray->height = gray->height;
floatGray->color_range = AVCOL_RANGE_JPEG;
av_frame_get_buffer(floatGray,0);

SwsContext* sws_ctx = sws_getContext(
    gray->width,gray->height,AV_PIX_FMT_GRAY8,floatGray->width,floatGray->height,AV_PIX_FMT_GRAYF32,SWS_BILINEAR,NULL,NULL);
av_opt_set_int(sws_ctx,"src_range",1,0);
av_opt_set_int(sws_ctx,"dst_range",0);

int ret = sws_scale(sws_ctx,(const uint8_t* const*)gray->data,gray->linesize,floatGray->data,floatGray->linesize);
if (ret < 0)
    printf("error (1): %d\n",ret);

sws_freeContext(sws_ctx);


AVFrame* floatRGB = av_frame_alloc();
floatRGB->format = AV_PIX_FMT_GBRPF32;
floatRGB->width = gray->width;
floatRGB->height = gray->height;
floatRGB->color_range = AVCOL_RANGE_JPEG;
av_frame_get_buffer(floatRGB,0);

sws_ctx = sws_getContext(
    gray->width,floatRGB->width,floatRGB->height,AV_PIX_FMT_GBRPF32,0);

ret = sws_scale(sws_ctx,floatRGB->data,floatRGB->linesize);
if (ret < 0)
    printf("error (1): %d\n",ret);
sws_freeContext(sws_ctx);

uint8_t* input = gray->data[0];
float* out = (float*)floatGray->data[0];
float* outG = (float*)floatRGB->data[0];
float* outB = (float*)floatRGB->data[1];
float* outR = (float*)floatRGB->data[2];

printf("input: \n");
for (int i = 0; i < 4; ++i)
    printf("%d,",input[i]);
printf("\ngray floats: \n");
for (int i = 0; i < 4; ++i)
    printf("%.5f,out[i]);
printf("\nRGB floats (G): \n");
for (int i = 0; i < 4; ++i)
    printf("%.5f,outG[i]);
printf("\nRGB floats (B): \n");
for (int i = 0; i < 4; ++i)
    printf("%.5f,outB[i]);
printf("\nRGB floats (R): \n");
for (int i = 0; i < 4; ++i)
    printf("%.5f,outR[i]);

这是我得到的输出

input:
0,255,gray floats:
0.00000,0.33333,0.66667,1.00000,RGB floats (G):
0.52912,0.86114,RGB floats (B):
0.00000,0.00000,0.11012,RGB floats (R):
0.00000,0.29512,

虽然我期望 RGB 浮点数的所有通道为 0.00000、0.33333、0.66667、1.00000,但这显然不是我得到的。 FWIW,如果我使用 rgb24 而不是 gray8 作为输入(所以 rgb24->gray32f 和 rgb24->gbrpf32),那么它几乎对两者都可以正常工作,除了对于 grayf32 格式似乎使用了错误的颜色范围(尽管正在设置)并且 gbrpf32 存在一些舍入误差(代码显示):

gray floats:
0.06250,0.34766,0.63282,0.91798,RGB floats (G):
0.00000,0.33205,0.66410,0.99615,

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...