如何从AVFrame中获取亮度图片

Howto get luminance pictrue from AVFrame?

本文关键字:亮度 获取 AVFrame      更新时间:2023-10-16

我正在处理mpeg-4和h264流

首先,我尝试转换为rgb24并使用imagemagic制作灰度,但它不适用于

while(av_read_frame(pFormatCtx, &packet)>=0)
    {
        // Is this a packet from the video stream?
        if(packet.stream_index==videoStream)
        {
            // Decode video frame
            avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished,
                                  &packet);
            // Did we get a video frame?
            if(frameFinished)
            {
                f++;
                //this->fram->Clear();
               // if (pFrame->pict_type == AV_PICTURE_TYPE_I) wxMessageBox("I cadr");
               // if (pFrame->pict_type != AV_PICTURE_TYPE_I)
               // printMVMatrix(f, pFrame, pCodecCtx);
                pFrameRGB->linesize[0]= pCodecCtx->width*3; // in case of rgb4  one plane
                sws_scale(swsContext, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);

                Magick::Blob* m_blob = new Magick::Blob(pFrameRGB->data,pCodecCtx->width*pCodecCtx->height*3);
                Magick::Image* image =new Magick::Image(*m_blob); // this doesnotwork
                image->quantizeColorSpace( Magick::GRAYColorspace );
                image->quantizeColors( 256 );
                image->quantize( );

但是ffmpeg给了我YUV图片?!所以只需要Y分量,如何得到它?获取Ypicture[x][y]

我假设您已经将swscale配置为YUV420p颜色空间。420P表示4:2:0平面。平面表示颜色通道是独立的。

亮度数据(Y)存储在pFrame->data[0]的缓冲点中(Cb和Cr分别在pFrame->data[1]和pFrame->data[2]中)。在YUV420中,Y平面是每像素1个字节。

因此:

uint8_t getY(int x, int y, AVFrame *f)
{
    return f->data[0][(y*f->linesize)+x];
}