【发布时间】:2019-11-17 20:52:03
【问题描述】:
我有一个运行视频的 OpenCV 循环。我想在第二帧暂停视频,让用户点击两点。
import time
import cv2
points=[]
layer = 0
def onMouse(event, x, y, flags, param):
if len(points) < 2:
if event == cv2.EVENT_LBUTTONDOWN:
points.append((x,y))
cap = cv2.VideoCapture(path)
while cap.isOpened():
layer +=1
ret, im = cap.read()
if ret == True:
cv2.imshow(win, im)
key = cv2.waitKey(100)
if len(points) < 2 and layer==2:
cv2.setMouseCallback(win, onMouse)
if key == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()
但前面的代码不会暂停用户输入。
如果我尝试:
time.sleep(5)
整个程序冻结。
我也尝试过在 while 循环中使用 while 循环,但它也会冻结
if layer == 2:
while len(points) < 2:
cv2.setMouseCallback(win, onMouse)
if len(points) == 2:
break
我可以做些什么来暂停用户输入两次点击
【问题讨论】:
-
setMouseCallback 只需调用一次。
-
@Micka 了解并感谢您,但这并不能真正解决我的问题。
-
你改了吗?我可以想象,多个 setMouseCallbacks 可能会导致冻结,因为许多 openCV gui 问题会导致feezes。应该在循环之外设置回调。您可以在循环和回调中添加打印,以便轻松找出卡住的位置以及回调是否被激活。
-
@Micka 是的,只是在 while 循环之外只用一个 setMouseCallback 对其进行了测试。即使有多个 setMouseCallback 它运行良好,但是当我尝试使用
time.sleep或 while 循环暂停到一个帧时,它会冻结。我只需要一种在不暂停 OpenCV 事件循环的情况下暂停到帧的方法。 -
waitKey(0),如果存在 opencv 窗口。重复的 waitKey(100) 也可以。
标签: python python-3.x opencv