【问题标题】:How to pause a OpenCV video video stream to get points?如何暂停 OpenCV 视频视频流以获得积分?
【发布时间】: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


【解决方案1】:

以下代码似乎对我有用。

if layer == 2:
    cv2.setMouseCallback(win, onMouse)
    cv2.waitKey(0)

how-should-i-properly-use-cv2-waitkey-when-wanting-to-start-pause-a-video

但是如果列表中有两点,关于如何转义等待键的任何建议?

【讨论】:

  • while(whatever) cv2.waitKey(100)
猜你喜欢
  • 2014-01-29
  • 2018-07-04
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多