Python 在循环时无意中堆叠
我现在有一个程序,用来显示图像,并允许在按键上执行各种功能(例如,加载新帧、裁剪感兴趣区域等)。它还设置为,如果有太多的时间没有动作,它会自动尝试加载新图像Python 在循环时无意中堆叠,python,python-2.7,ros,Python,Python 2.7,Ros,我现在有一个程序,用来显示图像,并允许在按键上执行各种功能(例如,加载新帧、裁剪感兴趣区域等)。它还设置为,如果有太多的时间没有动作,它会自动尝试加载新图像 def triggeredbytimer(): global f, x1i, y1i, x2i, y2i, sid, keepgoing keepgoing = False print "Inactivity has lead to an automatic refresh. Loading newest image
def triggeredbytimer():
global f, x1i, y1i, x2i, y2i, sid, keepgoing
keepgoing = False
print "Inactivity has lead to an automatic refresh. Loading newest image."
f = 0; t = 0
incoming = imagerequest(sid, f, t, x1i, y1i, x2i, y2i)
imagecallback(incoming)
def imagecallback(data):
print "----------------------- imagecallback"
global sid, f, x1i, y1i, x2i, y2i, img, refPt, cropping, keepgoing
keepgoing = True
########### \\// change this to change wait for autorefresh
tmr = Timer(10.0, triggeredbytimer)
tmr.start()
##################################
b = data.b; t = data.tr; sid = data.sid; error = int(data.error)
t = float(t); sid = int(sid)
expandedt = time.strftime("%m-%d-%Y %H:%M:%S", time.localtime(t))
print str(t) + " ----> " + expandedt
print "----------------------- image incoming"
timestr = time.strftime("%H:%M:%S", time.gmtime(t))
print "Loaded image from %s."%timestr
imagedata = bridge.imgmsg_to_cv2(b, "bgr8")
npimg = cv2.imencode('.jpg', imagedata)
cv2.imwrite('temp_image_np.jpg', imagedata)
img = cv2.imread('temp_image_np.jpg')
clone = img.copy()
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.setMouseCallback("image", mouseclickcb)
cv2.imshow("image", img)
while keepgoing == True:
key = cv2.waitKey(0) & 0xFF
## (here there are a lot of keypress functions, for brevity I included only one)
elif key == ord("t"):
print "Looking for newest frame..."
tmr.cancel()
t = 0; f = 0
incoming = imagerequest(sid, f, t, x1i, y1i, x2i, y2i)
imagecallback(incoming)
(注意:图像是通过服务从ROS程序中获取的,这就是“imagerequest”功能的来源。所有这些都可以正常工作:问题具体如所述。)
总而言之,由于在这个片段中有一些不相关的剪辑,imagecallback加载了一个图像。调用该函数时,计时器启动(时间限制是任意的,此处设置为低以进行测试)。计时器过期时,triggeredbytime()请求一个新映像。它通过ROS服务获取图像,然后从中获取返回并将其用作imagecallback(数据)的输入,从而加载图像并允许所有按键功能仍然有效
因此,问题在于,每当程序使用新帧刷新时,while keepgoing==True循环都不会停止,从而导致层叠循环继续进行,并且每次刷新都会变得更糟。这会导致一个按键执行多次,这会很快淹没它从中提取图像的程序。(最初,这只是暂时正确的:loop,但我添加了“keepgoing”变量来尝试纠正这种情况——事实上没有成功。)我不确定如何解决这个问题,尝试关闭循环足够长的时间以杀死第一个循环,但允许下一个循环执行到目前为止还没有成功。当keepgoing==True循环时,是否有任何方法可以干净地退出此循环,以防止事物堆积成这样,或者是否有更好的方法来解决在一定时间后加载新图像的问题
谢谢
编辑:需要明确的是,问题在于当计时器点击0时结束“while”循环。设置keepgoing=False似乎不起作用(可能是因为我无法“返回”它),因此,如果可能的话,我需要类似的东西…您可以在imagecallback中添加第二个参数,告诉它在将keepgoing设置为false之前应该运行多长时间或多少次。但是如果我希望它无限期地运行,直到计时器启动或按下某个键为止,这会起作用吗?所以您希望它持续运行,直到发生事件为止会发生,但你不想让它运行得太频繁?同样的解决方案,只需添加变量并让它等待x次,这样循环每N次执行一次。更好的方法是让它在任意时间内休眠,然后执行,或者在事件发生时中断。我不确定如何按照您描述的方式运行它。将while替换为for(在范围内),并在变量到达末尾之前对其自身进行迭代重置?为imagecallback(数据,x)添加第二个参数,并在while循环下添加:if count