opencv - 如何将帧数据从 FFmpegSource2 (FFMS2) FFMS_Frame 结构复制到 OpenCV Mat?

标签 opencv ffmpeg frame mat

我正在尝试使用 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 的有效方法。

关于opencv - 如何将帧数据从 FFmpegSource2 (FFMS2) FFMS_Frame 结构复制到 OpenCV Mat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19169258/

相关文章:

ffmpeg - 对视频中的 PAR(像素长宽比)感到困惑

javascript - Fancybox - 如何更改 iframe 的内容?

c++ - 我可以用 C 包装 OpenCV 的 C++ 接口(interface),然后用 Lisp 的 CFFI 包装它吗?

java - java系统库不加载opencv库

python-3.x - 查找图像中的主线(及其角度)

java - 如何修复 Java 中的 CDC float AWT 框架?

opengl - 如何使用 OpenGL 渲染到帧缓冲区而不在屏幕上显示?

opencv - 修复由 HD Home Run 制作的 TS 文件

ffmpeg 奇怪的 x264 编码行为

ffmpeg - 尝试使用 ffmpeg 调整 m3u8 视频的大小