下面是一个简单 Flask 应用程序的 Python 代码,该应用程序在网页上显示网络摄像头源:
from flask import Flask, render_template, Response
import cv2
app=Flask(__name__)
cam=cv2.VideoCapture(0)
def gen():
while True:
success,frame=cam.read()
if not success:
continue
success,frame=cv2.imencode(".jpg", frame)
frame=frame.tobytes()
yield(b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
@app.route("/")
def index():
return render_template("test.html")
@app.route("/video")
def video():
return Response(gen(),mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0', port=80)
我按照 OpenCV 文档和我在网上找到的一些代码示例实现了 gen() 函数,但在运行应用程序时出现以下错误:
[ WARN:[email protected]] global cap_gstreamer.cpp:2838 handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Device '/dev/video0' is busy
[ WARN:[email protected]] global cap_gstreamer.cpp:1698 open OpenCV | GStreamer warning: unable to start pipeline
[ WARN:[email protected]] global cap_gstreamer.cpp:1173 isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
[ WARN:[email protected]] global cap_v4l.cpp:997 open VIDEOIO(V4L2:/dev/video0): can't open camera by index
[ERROR:[email protected]] global obsensor_uvc_stream_channel.cpp:159 getStreamChannelGroup Camera index out of range
我通过单独打开和释放每个帧的视频捕获来解决这个问题,如下所示:
def gen():
while True:
cam=cv2.VideoCapture(0)
success,frame=cam.read()
cam.release()
if not success:
continue
success,frame=cv2.imencode(".jpg", frame)
frame=frame.tobytes()
yield(b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
但这仅适用于非常低的帧速率,这确实令人沮丧,因为它应该适用于第一次实现。不,相机不被任何其他进程使用。另外,当 python 代码运行时,我的相机上的 LED 指示灯会亮起,并在我停止运行后关闭。
为了解决这个问题,我尝试重新安装所有必需的 python 库和系统依赖项,例如 v4l2 和 gstreamer。我还尝试使用不同的网络摄像头来检查我使用的特定网络摄像头是否有问题。
只需在
cam
函数中声明 gen()
即可解决该问题。