【问题标题】:Video upsampling with C/C++使用 C/C++ 进行视频上采样
【发布时间】:2010-08-10 10:14:56
【问题描述】:

我想对一组捕获的(来自网络摄像头)OpenCV 图像或相应的浮点数组进行上采样(像素值不需要是离散整数)。不幸的是,上采样率并不总是整数,所以我不知道如何用简单的线性插值来做到这一点。 有没有更简单的方法或库来做到这一点?

【问题讨论】:

  • 您的意思是要更改空间分辨率(即每帧的宽度和高度,以像素为单位)还是颜色分辨率,即用于表示每个像素颜色的位数?
  • 不,我不是指图像大小调整/重新采样,我指的是帧速率。想象一下,在 10 秒的捕捉结束时,我有 160 帧,我需要有 200 帧(出于某种原因)。捕获率并不总是相同的,所以我必须构建一些动态算法。

标签: c++ c video-capture video-processing


【解决方案1】:

好吧,我不知道有什么库可以进行帧率缩放。

但我可以告诉你,最合适的方式是自己减少或加倍帧。

通过简单的线性像素插值混合图片不会提高质量,现在播放仍然会显得生涩甚至模糊。

要正确插入帧速率,需要更复杂的算法。 现代电视为此内置了硬件和视频编辑软件,例如After-Effects 具有执行此操作的功能。

这些算法能够通过运动分析在图片之间创建。但这超出了小问题解决的范围。

因此,要么继续搜索您可以使用的现有库,要么通过丢弃/加倍帧来完成。

【讨论】:

  • 丢帧/加倍帧看起来非常难看(我已经看到很多错误编码的动画以这种方式从 VFR 转换为 CFR ......)但实际上它是唯一承认简单的解决方案执行。其他一切都需要高级运动分析,并且会非常缓慢。
【解决方案2】:

ImageMagick MagickWand 库将使用适当的过滤算法调整图像大小 - 请参阅 MagickResizeImage() 函数(并使用 Sinc 过滤器)。

【讨论】:

    【解决方案3】:

    我不是 100% 熟悉视频捕获,所以我不确定您所说的“像素值不需要是离散整数”是什么意思。这是否意味着每个像素的颜色信息可能不是整数?

    我假设“上采样率并不总是整数”,您的意思是您将从一种分辨率上采样到另一种分辨率,但您可能不会增加一倍或三倍。例如,不是 640x480 -> 1280x960,而是 640x480 -> 800x600。

    一个简单的算法可能是:

    对于较大网格中的每个像素

    • 将 x/y 值缩放到 0,1 之间(x 除以宽度,y 除以高度)
    • 按较小网格的宽度/高度缩放 ​​x/y 值 -> xSmaller, ySmaller
    • 通过浮点地板/天花板函数确定包含您的点的四个像素
    • 获取该点所在矩形内的 x/y 值,
      介于 0,1 之间(减去地板/天花板值 xSmaller、ySmaller)-> xInterp、yInterp
    • 从黑色开始,然后添加您的四种颜色,按每种颜色的 xInterp/yInterp 因子进行缩放

    您可以通过创建查找表来映射像素来加快多帧的速度 -> xInterp/yInterp 值

    我确信有比线性插值(双线性等)更好的算法。这似乎是您希望在处理器级别优化的东西。

    【讨论】:

      【解决方案4】:

      使用 ffmpeg 项目中的libswscale。它是最优化的,支持多种不同的重采样算法。

      【讨论】:

      • 你确定它会重新采样帧率吗?如果是这样,你能提供一个小例子的链接吗?我很难找到教程或文档。
      • 哦,帧率重采样?我误读并认为您的意思是空间重采样。帧率重采样是一个非常困难的问题,因为视频总是在时间方向上严重欠采样,因此会出现混叠,从而排除了任何朴素线性滤波器的使用。基本上,您需要一些适用于运动估计和运动矢量插值的东西。我记得在网上某处有一个不错的实现,但不幸的是我不记得它在哪里或叫什么。 :( 希望我对所需内容的描述能帮助您找到它。
      猜你喜欢
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2022-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      相关资源
      最近更新 更多