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)
| 归档时间: |
|
| 查看次数: |
5898 次 |
| 最近记录: |