我正在编写一个python flask程序,其主要任务是在浏览器上连续显示摄像机捕获的(视频流)。我也用烧瓶。
下面是读取相机的代码。
obj1 = Camerareader.Camerareader(0)
obj1.open_webcam()
我的通话休息api看起来如下
def gen1():
"""Video streaming generator function."""
global obj1
if ( obj1.is_webcam_open() == 1):
obj1.camera_release()
del( obj1)
obj1 = Camerareader.Camerareader(CAMERA_INDEX1)
video = obj1.open_webcam()
#video = obj1.get_cam_cap()
while True:
rval, frame = video.read()
cv2.imwrite("t1.jpg", frame)
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + open("t1.jpg", 'rb').read() + b'\r\n')
@app.route('/video_feed1')
def video_feed1():
"""Video streaming route. Put this in the src attribute of an img tag."""
return Response(gen1(),mimetype='multipart/x-mixed-replace; boundary=frame')
这里,我试图做的是使用浏览器进行的任何调用都应提供供稿,该供稿可以按预期工作。
情况1:一种加载流的浏览器工作正常。(http://localhost:prt/video_feed1)
情况2:停止第一个浏览器并启动第二个浏览器也可以正常工作。
情况3:拳头一跑,第二秒就开始出现以下错误。
open webcam
Error on request:
Traceback (most recent call last):
cv2.imwrite("t1.jpg", frame)
cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgcodecs/src/loadsave.cpp:715: error: (-215:Assertion failed) !_img.empty() in function 'imwrite'
如您所见,打开网络摄像头很好,但不确定为什么框架会空着不确定出什么问题
下面是该类的代码以打开网络摄像头
class Camerareader(object):
def __init__(self,CameraIndex ):
self.cameraIndex = CameraIndex
self.debug = False
self.cap = 0
def resetData(self):
self.imageState = IDLE
def open_webcam(self):
print("open webcam")
self.cap = cv2.VideoCapture(self.cameraIndex)
return self.cap
def is_webcam_open(self):
if(self.cap.isOpened()):
return 1
else:
return 0
def get_cam_cap(self):
return self.cap
def camera_release(self):
self.cap.release()
通过打开第二个浏览器窗口,当另一个实例已经在运行时,您再次调用gen1
。
由于gen1
的两个实例都为cv2.imwrite
使用相同的文件名,所以它们同时写入同一文件,这会破坏事情:
Traceback (most recent call last):
cv2.imwrite("t1.jpg", frame)
cv2.error: OpenCV(4.2.0) [...] (-215:Assertion failed) !_img.empty() in function 'imwrite'
错误告诉您imwrite
函数期望目标文件为空。
也许您可以通过在每次调用该函数时选择一个不同的文件名来解决问题,例如通过使用tempfile
模块。