c - 使用 openCV 在 C 中实现 3d 函数 [视频] 的 1d DFT

标签 c video opencv dft

我正在尝试在 C 编程中沿着 GOP(图片组 - 基本上是视频)计算 1d DFT。我需要沿时间方向应用一维 DFT,将 gop 转换为时间频率域。 在该域中,空间信息和时间频率信息存在于同一帧中。

大小为 (M , N , T) 的视频 f(x, y, t) 的一维 DFT,其中 M x N 是每帧的大小,T 是 GOP 中的帧总数由以下等式计算:

formula equation

有谁知道我如何使用 openCV 或类似的东西来处理这个问题?

如果您需要任何其他信息,请告诉我!

最佳答案

如果我正确理解你的问题,你想计算相对于时间坐标的傅里叶变换。

为了做到这一点,我认为你需要将 3D 立方体 reshape 为 2D 矩阵,其中垂直坐标是像素索引(在 [0, MN-1] 范围内),水平坐标是时间(范围 [0, T-1]),即每一行包含序列中一个像素的值。 然后,您可以使用 cv::dft() 函数和标志 CV_DFT_ROWS 沿每一行应用 DFT 例程。

矩阵创建

要创建矩阵,您可以按以下步骤操作(假设视频帧有 M 行和 N 列):

  1. 分配一个包含 NM 行和 T 列的 cv::Mat,其中 T 是时间窗口的宽度 (它可以是几帧或 while 序列长度)。我们将此矩阵称为 W(窗口)。

  2. 对于窗口中的每个帧 I(.,.,t),复制每个像素 I(x,y,t)(x 范围在 [0,N-1] 中,y 范围在 ]0 中, M-1]) 到 W 中的相应位置,即 W(y*M+x, t)

在此过程结束时,W 将在每一行中包含一个像素随时间变化的值。然后,在 W 上调用带有 CV_DFT_ROWS 标志的 cv::dft,将 2D 傅里叶变换限制在水平方向,这就是时间。

关于c - 使用 openCV 在 C 中实现 3d 函数 [视频] 的 1d DFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10658603/

相关文章:

javascript - 全屏视频 Sprite

java - 如何使用java制作一个空Mat?

python - 用for循环遍历二值化图像可能吗?

scala - OpenCV 获取矩阵的形状

c - 使用 FFT 重复计算函数导数时产生的数值误差

c - 为 Pro Micro 编写 Windows 驱动程序

c - 猜数字游戏缺少一个循环

c - 从 MJPEG 流中抓取一个图像帧

c - for 循环接受比循环条件多一个值

video - 使用 GStreamer 将 M3U8 播放列表转换为 MP4