我正在尝试使用 FFmpegSource2 (FFMS2) 读取视频文件,然后使用 OpenCV 处理帧。将帧数据从 FFMS_GetFrame 函数返回的 FFMS_Frame 结构复制到 OpenCV Mat 的正确有效方法是什么?
非常感谢您提前。
现在我正在使用以下适用于 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 的有效方法。