python
from flask import Flask, Response
import cv2
app = Flask(__name__)
# 基础文字回复
@app.route('/')
def hello_world():
return '''
<h1>你好啊世界</h1>
<img src="/camera" width="640" />
'''
# 摄像头拍照并返回图像
@app.route('/camera')
def capture_camera():
# 尝试打开摄像头
cap = cv2.VideoCapture(0)
if not cap.isOpened():
return "摄像头打开失败,请检查设备", 500
# 读取一帧图像
success, frame = cap.read()
cap.release() # 释放摄像头
if not success:
return "图像捕获失败", 500
# 将图像转为 JPEG 格式字节流
ret, buffer = cv2.imencode('.jpg', frame)
if not ret:
return "图像编码失败", 500
# 返回图像数据
return Response(buffer.tobytes(), mimetype='image/jpeg')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=3344, debug=False)
使用步骤
-
安装依赖库(需提前安装 OpenCV):
pip install flask opencv-python
-
运行程序:
python server.py
-
手机访问:
-
在手机浏览器输入
http://你的服务器IP:3344
(本地测试用电脑内网 IP,公网需端口转发) -
页面会显示文字 "你好啊世界" 和摄像头实时拍摄的照片(每次刷新页面会更新)。
-
关键注意事项
-
摄像头权限:
-
如果运行在 Windows/Mac/Linux 本地,确保摄像头驱动正常且未被其他程序占用。
-
云服务器(如腾讯云)无物理摄像头,此代码无法直接运行,需在本地设备测试。
-
-
延迟问题:
- 每次访问
/camera
会重新打开摄像头拍照,频繁刷新可能导致延迟。若需实时视频流,需改用 WebSocket 或 MJPEG 流(需修改代码逻辑)。
- 每次访问
-
安全风险:
- 开放公网端口
3344
时,确保防火墙限制访问 IP,避免被恶意扫描。
- 开放公网端口
效果示意图
-
手机访问页面会显示类似如下内容(文字 + 摄像头图像):
你好啊世界 [此处显示摄像头拍摄的图片]