如何修复 django 中的冻结 cv2.imshow(来自 opencv)
How to fix the freezing cv2.imshow(from opencv) in django
我想做的是当用户单击按钮时,django 将 运行 python 代码并检测人。我使用来自 imutils.video 的 VideoStream,但它只是弹出 window 并冻结。当我测试人脸识别时,它工作得很好,但一旦我将相同的代码放入 django。我的意思是它仍然可以检测到人,但它只检测到第一帧然后它会冻结。
视频流来自imutils.video,cv2.imshow来自opencv。
这是视频流的代码。即使我 运行 单独的视频流(没有人脸识别码),它仍然卡住。
def detect(request):
vs = VideoStream("http://192.168.1.109:8080/video").start()
while True:
frame = vs.read()
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q") :
break
else:
time.sleep(30)
break
cv2.destroyAllWindows()
vs.stop()
return render(request,"attendance/detect.html")
如果无法修复,有什么建议可以做同样的事情吗?谢谢
试试这个:
while True:
frame = vs.read()
cv2.imshow("Frame", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
vs.stop()
老实说我不太明白你想做什么。你想每 30 秒等一次再拍一张照片吗?您的代码似乎在 if 条件和 else 条件
中都中断了 while 循环
编辑:30 秒流
2 个选项
1) 对于30秒的流,你需要计算你的fps并在达到fps*30循环后中断。
2) 创建标志变量和超时函数
flag = 0
def timeout(sleep):
time.sleep(sleep)
flag = 1
threading.Thread(target = timetout, args=(30,)).start()
# in your loop then break when
if flag == 1:
break
我想做的是当用户单击按钮时,django 将 运行 python 代码并检测人。我使用来自 imutils.video 的 VideoStream,但它只是弹出 window 并冻结。当我测试人脸识别时,它工作得很好,但一旦我将相同的代码放入 django。我的意思是它仍然可以检测到人,但它只检测到第一帧然后它会冻结。
视频流来自imutils.video,cv2.imshow来自opencv。
这是视频流的代码。即使我 运行 单独的视频流(没有人脸识别码),它仍然卡住。
def detect(request):
vs = VideoStream("http://192.168.1.109:8080/video").start()
while True:
frame = vs.read()
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q") :
break
else:
time.sleep(30)
break
cv2.destroyAllWindows()
vs.stop()
return render(request,"attendance/detect.html")
如果无法修复,有什么建议可以做同样的事情吗?谢谢
试试这个:
while True:
frame = vs.read()
cv2.imshow("Frame", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
vs.stop()
老实说我不太明白你想做什么。你想每 30 秒等一次再拍一张照片吗?您的代码似乎在 if 条件和 else 条件
中都中断了 while 循环编辑:30 秒流
2 个选项
1) 对于30秒的流,你需要计算你的fps并在达到fps*30循环后中断。
2) 创建标志变量和超时函数
flag = 0
def timeout(sleep):
time.sleep(sleep)
flag = 1
threading.Thread(target = timetout, args=(30,)).start()
# in your loop then break when
if flag == 1:
break