OpenCV视频稳定算法

opencv video stabilization algorithm

本文关键字:算法 视频 OpenCV      更新时间:2023-10-16

我正在使用opencv编写视频稳定器。算法如下:

虽然视频中有更多的帧:

  1. 从视频中获取新帧
  2. 检测新帧中的关键点
  3. 新关键点的计算描述符
  4. 匹配新帧和上一帧的描述符
  5. 筛选匹配项
  6. 以获得良好的匹配项
  7. 查找旧帧和新帧之间的单应性
  8. 将单应性(warpPerspective)应用于新框架,从而创建"调整后的新框架"
  9. 将上一帧设置为等于"调整后的新帧"(描述符、关键点)

我有几个问题。我走在正确的轨道上吗?如何进行实际稳定(使用高斯滤波器或其他东西)?

以下是可能的步骤顺序:

第 1 步。从影片文件中读取帧

第 2 步。从每一帧中收集突出点

第 3 步。选择点之间的对应关系

第 4 步。从噪声对应估计变换

第5步。变换近似和平滑

第 6 步。在完整视频上运行

有关每个步骤的更多详细信息,您可以在此处找到:

http://www.mathworks.com/help/vision/examples/video-stabilization-using-point-feature-matching.html

我认为您可以在OpenCV中遵循相同的步骤。

如果您使用的是python代码,那么您可以使用我强大的线程VidGear视频处理python库,该库现在以最小的延迟提供实时视频稳定功能,并且以Stabilizer Class几乎没有额外的计算能力要求为代价。为方便起见,下面是一个基本用法示例:

# import libraries
from vidgear.gears import VideoGear
from vidgear.gears import WriteGear
import cv2
stream = VideoGear(source=0, stabilize = True).start() # To open any valid video stream(for e.g device at 0 index)
# infinite loop
while True:
    frame = stream.read()
    # read stabilized frames
    # check if frame is None
    if frame is None:
        #if True break the infinite loop
        break
    # do something with stabilized frame here
    cv2.imshow("Stabilized Frame", frame)
    # Show output window
    key = cv2.waitKey(1) & 0xFF
    # check for 'q' key-press
    if key == ord("q"):
        #if 'q' key-pressed break out
        break
cv2.destroyAllWindows()
# close output window
stream.stop()
# safely close video stream

更高级的用法可以在这里找到:https://github.com/abhiTronix/vidgear/wiki/Real-time-Video-Stabilization#real-time-video-stabilization-with-vidgear