在Python/OpenCV中,有没有一种方法可以快速滚动视频帧,允许用户选择要处理的开始帧和结束帧?

2024-03-15

在准备处理视频时,我希望用户能够选择视频中要处理的第一帧和最后一帧。轨迹栏似乎是执行此操作的有用工具,但我可以使用它来读取和显示视频中的特定帧吗?

通常,我会逐帧读取视频,并使用 while 循环对其运行处理算法:

cap = cv2.VideoCapture('myvideo.mp4')
while(cap.isOpened()):
    ret, frame = cap.read()
    # ....

这不利于用户快速浏览视频以找到合适的帧间隔进行处理。

轨迹栏非常适合设置图像处理参数,但如果您能想到更好的工具,请建议。下面您可以看到一些使用轨迹栏设置阈值级别变量的代码。

def onTrackbarChange(trackbarValue):
    pass

cv2.createTrackbar( 'threshold level', 'mywindow', 100, 255, onTrackbarChange )

thresholdlevel = cv2.getTrackbarPos('thresh','mywindow')

有没有办法做这样的事情?

start_frame = cv2.getTrackbarPos('start-frame','mywindow')
ret, frame = cap.read(start_frame) #don't think this is possible
cv2.imshow('window', frame)

理想情况下应该有两块窗板,其中一块带有start_frame,以及一个与stop_frame,每个都由一个轨迹栏控制。


首先,您可以通过以下方式设置视频位置:

cap.set(cv2.CAP_PROP_POS_FRAMES,pos)

然后它只是将各个部分放在一起,让它们使用轨迹栏播放,当按下某个键时,播放间隔:

import cv2
cap = cv2.VideoCapture('david.mpg')
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

def onChange(trackbarValue):
    cap.set(cv2.CAP_PROP_POS_FRAMES,trackbarValue)
    err,img = cap.read()
    cv2.imshow("mywindow", img)
    pass

cv2.namedWindow('mywindow')
cv2.createTrackbar( 'start', 'mywindow', 0, length, onChange )
cv2.createTrackbar( 'end'  , 'mywindow', 100, length, onChange )

onChange(0)
cv2.waitKey()

start = cv2.getTrackbarPos('start','mywindow')
end   = cv2.getTrackbarPos('end','mywindow')
if start >= end:
    raise Exception("start must be less than end")

cap.set(cv2.CAP_PROP_POS_FRAMES,start)
while cap.isOpened():
    err,img = cap.read()
    if cap.get(cv2.CAP_PROP_POS_FRAMES) >= end:
        break
    cv2.imshow("mywindow", img)
    k = cv2.waitKey(10) & 0xff
    if k==27:
        break
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python/OpenCV中,有没有一种方法可以快速滚动视频帧,允许用户选择要处理的开始帧和结束帧? 的相关文章

随机推荐