0

我正在尝试使用 FFmpegSource2 (FFMS2) 读取视频文件,然后使用 OpenCV 处理帧。将帧数据从 FFMS_GetFrame 函数返回的 FFMS_Frame 结构复制到 OpenCV Mat 的正确有效方法是什么?

非常感谢您提前。

4

1 回答 1

0

现在我正在使用以下适用于 BGR 颜色格式的过程。

步骤 1. 我使用 FFMS_SetOutputFormatV2 和 FFMS_GetPixFmt( "bgra" ) 将 FFMS 的输出像素格式设置为 BGR。

int anPixFmts[2];
anPixFmts[0] = FFMS_GetPixFmt( "bgra" );
anPixFmts[1] = -1;

if( FFMS_SetOutputFormatV2( pstFfmsVidSrc, anPixFmts
    , pstFfmsFrameProps->EncodedWidth, pstFfmsFrameProps->EncodedHeight
    , FFMS_RESIZER_BICUBIC, &stFfmsErrInfo ) )
{
    // handle error
}

步骤 2. 使用 FFMS_GetFrame 读取所需的帧。

int nCurFrameNum = 5;
const FFMS_Frame *pstCurFfmsFrame = FFMS_GetFrame( pstFfmsVidSrc, nCurFrameNum, &stFfmsErrInfo );

步骤 3. 将数据从 pstCurFfmsFrame 复制到 OpenCV Mat、oMatA:

Mat oMatA;
oMatA = Mat::zeros( pstCurFfmsFrame->EncodedHeight, pstCurFfmsFrame->EncodedWidth, CV_8UC3 );
int nDi = 0;
for( int nRi = 0; nRi < oMatA.rows; nRi++ )
{
    for( int nCi = 0; nCi < oMatA.cols; nCi++ )
    {
       oMatA.data[oMatA.step[0] * nRi + oMatA.step[1] * nCi + 0] = pstCurFfmsFrame->Data[0][nDi++]; // B
       oMatA.data[oMatA.step[0] * nRi + oMatA.step[1] * nCi + 1] = pstCurFfmsFrame->Data[0][nDi++]; // G
       oMatA.data[oMatA.step[0] * nRi + oMatA.step[1] * nCi + 2] = pstCurFfmsFrame->Data[0][nDi++]; // R
       nDi++;
    }
}

必须更改此代码以支持其他颜色格式(例如,像 YV12 这样的平面格式使用多个 pstCurFfmsFrame->Data 平面)。可能有人可以提供完整的功能来支持大多数颜色格式以及将数据从 pstCurFfmsFrame->Data 复制到 OpenCV Mat 的有效方法。

于 2013-10-04T10:17:33.480 回答