python - 线程没有在python中打开目标函数
问题描述
我想打开一个函数,通过调用 cv2.imshow() 方法在屏幕上显示加载视频。首先,我想演示代码,然后是问题。
import cv2
import threading
def Load():
video = cv2.VideoCapture('Loading.mov')
if video.isOpened() == True:
cv2.namedWindow("The Video")
cv2.moveWindow("The Video", 500,200)
elif video.isOpened() == False:
print('No Data For Loading Video')
return 0
while video.isOpened():
_, frame = video.read()
if _ == True:
cv2.imshow("The Video",frame)
if cv2.waitKey(10) & 0xff == 27:
break
if _ == False :
break
cv2.destroyAllWindows()
video.release()
t = threading.Thread(target = Load)
t.start()
现在,问题:
当我第一次调用 t.start()时,线程启动并正确显示视频。循环中断后,如果我再次尝试创建一个新t
线程并再次 .start() 它,它根本不会显示任何内容!没有错误,什么都没有!
我正在使用 spyder 重新运行代码。而且我想在需要时重新播放视频。
现在,问题出在哪里?
解决方案
我用 mp4-Video ( http://techslides.com/demos/sample-videos/small.mp4 )尝试了你的代码,它可以工作。我使用https://video.online-convert.com/convert-to-mov将所述视频转换为 mov并且它仍然有效......
尽管我可能有一个有根据的猜测:您应该尝试使用新的 cv2 实例进行每次调用。
我认为问题可能是,线程的第二次调用继承了第一次调用的状态(尤其是 cv2 的内部状态),因为它只是一个函数,因此视频处于“已播放”状态或其他状态并且没有不要再显示任何东西了。
因此,如果您将所有内容放在一个类中并在每次调用 Load() 时使用 cv2 的新实例进行调用,它可能会起作用。
import cv2
import threading
class Video:
def play(self):
video = cv2.VideoCapture('small.mov')
if video.isOpened() == True:
cv2.namedWindow("The Video")
cv2.moveWindow("The Video", 500,200)
elif video.isOpened() == False:
print('No Data For Loading Video')
return 0
while video.isOpened():
_, frame = video.read()
if _ == True:
cv2.imshow("The Video",frame)
if cv2.waitKey(10) & 0xff == 27:
break
if _ == False :
break
cv2.destroyAllWindows()
video.release()
def Load():
v=Video()
v.play()
del v
t = threading.Thread(target = Load)
t.start()
推荐阅读
- sql - 日期大于整数日期的sql
- php - 我如何将购物车的内容通过电子邮件发送回网络版主
- c# - C# WPF:ODBC 应用程序:在同一版本中访问 32 位/64 位驱动程序?
- java - 构建开放日光时出错
- r - 订书:!LaTeX 错误:环境阴影未定义
- apache-kafka - 是否可以集成rabbitmq和kafka?
- python - 如何在python中展平谷歌bigquery结果
- python - 使用 mdates 和 matplotlib 将 x 轴设置为日期
- php - Atom Xdebug 无法在 Windows 上使用 PHPUnit CLI
- r - 通过 anova 与 purrr 或 dplyr 比较模型