原始yuv420p数据上的sws_scale

问题描述 投票:0回答:1

我正在从树莓派获取yuv420p格式的相机数据。我正在尝试使用sws_scale将它们转换为RGBA格式。这就是我初始化上下文的方式:

_sws_context = sws_getContext(CAMERA_WIDTH, CAMERA_HEIGHT, AV_PIX_FMT_YUV420P,
                                      CAMERA_WIDTH, CAMERA_HEIGHT, AV_PIX_FMT_RGBA, 0, nullptr, nullptr, nullptr);

我现在对如何设置sws_scale的数据和行大小有些困惑。从相机中,我得到的是字节的简单数组,而没有进一步的结构。我认为我必须以某种方式将其细分为飞机。我的第一种方法是根本不分离它,本质上是这样的(基于:

const uint8_t *src_data[] = {data.data()};
const int src_strides[] = {(int) std::ceil((CAMERA_WIDTH * 6) / 8)};

基于:

[2x2像素网格有12位

因此,我假设一行将使用其中一半。但这会导致分段错误。因此,我认为我必须以某种方式将src_datasrc_strides分为各自的YUV平面,但是我不确定如何执行此操作,尤其是因为YUV420数据的一个像素每个平面使用的字节数少于一个字节...

c++ image colors yuv
1个回答
0
投票

事实证明,它比我想象的要简单!飞机是一个接一个的,这也使步伐变得很明显:

        const auto y = data.data();
        const auto u = y + CAMERA_WIDTH * CAMERA_HEIGHT;
        const auto v = u + (CAMERA_WIDTH * CAMERA_HEIGHT) / 4;

        const auto stride_y = CAMERA_WIDTH;
        const auto stride_u = CAMERA_WIDTH / 2;
        const auto stride_v = CAMERA_WIDTH / 2;
© www.soinside.com 2019 - 2024. All rights reserved.