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

use*_*339 4 python video user-interface opencv image-processing

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

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

cap = cv2.VideoCapture('myvideo.mp4')
while(cap.isOpened()):
    ret, frame = cap.read()
    # ....
Run Code Online (Sandbox Code Playgroud)

这不利于用户快速扫描视频以找到要处理的良好帧间隔.

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

def onTrackbarChange(trackbarValue):
    pass

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

thresholdlevel = cv2.getTrackbarPos('thresh','mywindow')
Run Code Online (Sandbox Code Playgroud)

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

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

理想的情况下,将有两个窗板,一个与所述start_frame,和一个与所述stop_frame,各由一个的TrackBar控制.

ber*_*rak 10

首先,您可以设置视频位置:

cap.set(cv2.CAP_PROP_POS_FRAMES,pos)
Run Code Online (Sandbox Code Playgroud)

然后它只是将各个部分组合在一起,让它们与轨道栏一起玩,当按下一个键时,播放间隔:

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
Run Code Online (Sandbox Code Playgroud)