【问题标题】:Start video read from a particular frame开始从特定帧读取视频
【发布时间】:2014-01-31 08:39:10
【问题描述】:

我已经获得了一个已保存视频的 frame_count。

self.frame_count = self.capture.get(cv.CV_CAP_PROP_FRAME_COUNT) - 1

现在,我想从特定的 frame_count 开始读取帧。我该怎么做呢?

原因:我需要跟踪一个对象,并且使用 HSV 图像分割找到了我要跟踪的对象的位置。现在要跟踪它,我打算从该特定帧开始视频并将跟踪窗口设置为对象的坐标。

想要:它不应该是冗余和计算密集型的。

【问题讨论】:

    标签: python opencv image-processing hsv


    【解决方案1】:

    使用以下代码完成您的任务。

    您使用的 Opencv 版本较旧。使用 Opencv2。
    链接:
    http://docs.opencv.org/trunk/doc/py_tutorials/py_tutorials.html

    import numpy as np
    import cv2
    import os
    
    cam = cv2.VideoCapture('full_path/bird.avi')
    i = 1 
    initialize_first_frame = cam.read()[1]
    start_from_frame = 5
    dir =  './testImages/'
    os.makedirs(dir)
    while True:
        if(i>=start_from_frame):
          cv2.imshow('Frame Conversion',cam.read()[1])
          cv2.imwrite(dir + "/image-"+str(i).zfill(5)+".png",cam.read()[1])
        i = i + 1    
        key = cv2.waitKey(10)
        if key == 27:
           cv2.destroyWindow('Frame Conversion')
           break
    print "End"
    

    我希望这是你想要的代码。

    【讨论】:

    • 我确实使用 cv2 接口。再次感谢您提供详细的代码。我要对我的代码进行大量编辑,以确定它是否真的有效。所以稍后会有更多更新。
    • 我也使用 python opencv2 创建代码来跟踪对象。我对此有些怀疑。我可以知道您的电子邮件 ID 以询问其相关问题吗...?
    • chat.stackoverflow.com/rooms/6/python 我想你总是可以在这里提问或在这里发帖提问。我自己是个菜鸟。 :)
    【解决方案2】:

    尝试以下方法:

    f = # put here the frame from which you want to start
    self.capture.set(CV_CAP_PROP_POS_FRAMES, f)
    while f < self.frame_count:
        retval, image = self.capture.read()
        f += 1
    

    【讨论】:

    • 我有类似的想法,但计算量太大。因为它需要读取“不需要的”帧,直到找到正确的帧。我想要一种最佳的方法。
    • 使用capture.set(CV_CAP_PROP_POS_FRAMES, frame) 设置接下来要捕获的帧,然后再使用read() 开始阅读
    • @tilaprimera 我已经根据我之前的评论修改了答案
    • @tilaprimera 刚刚看到您的编辑在审核队列中弹出 - 由于对原始答案的更改太大而被拒绝,因此我将在此处发布更改。更改了两行:self.capture.set(CV_CAP_PROP_POS_FRAMES, f)while f &lt; total_frames:
    • @tilaprimera 当编辑出现在审核队列中时,我们看不到 cmets,所以我们不知道您和 wolfrevo 正在合作改进答案。这是一个小的编辑,但因为它改变了帖子的含义,它被归类为“彻底的改变”。 :) 解决这个问题的最佳方法是使用 PastebinGists 之类的服务来共享代码示例!
    【解决方案3】:

    对于任何版本的 OpenCV Python 3 和 4,请遵循 -

    import cv2
    # suppose you want to start reading from frame no 500
    frame_set_no = 500 
    cap = cv2.VideoCapture("full_path/cow.mp4")
     
    # capture is set to the desired frame
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_set_no)
    
    while True:
      ret, frame = cap.read()
      cv2.imshow("Video", frame)
      if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    cv2.destroyAllWindows()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2013-12-22
      相关资源
      最近更新 更多