diff --git a/carsrun/__pycache__/car.cpython-311.pyc b/carsrun/__pycache__/car.cpython-311.pyc index 196df95..3141b73 100644 Binary files a/carsrun/__pycache__/car.cpython-311.pyc and b/carsrun/__pycache__/car.cpython-311.pyc differ diff --git a/carsrun/appCam.py b/carsrun/appCam.py index 0e85ee3..e43927e 100644 --- a/carsrun/appCam.py +++ b/carsrun/appCam.py @@ -70,7 +70,7 @@ def gen_frames(): # generate frame by frame from camera @app.route('/control/sendit', methods=['POST']) def send_command(): # 定义目标 IP 地址、端口和路由 - ip = "192.168.98.204" + ip = "192.168.60.204" port = 3000 route = "sendit2" diff --git a/carsrun/apptest.py b/carsrun/apptest.py index 89b9d9e..72bda97 100644 --- a/carsrun/apptest.py +++ b/carsrun/apptest.py @@ -1,31 +1,46 @@ -from flask import Flask, render_template, Response -from picamera2 import Picamera2 -import time +from flask import Flask, request, jsonify import cv2 +import threading +import time app = Flask(__name__) -def gen_frames(): # generate frame by frame from camera - picam2 = Picamera2() - picam2.configure(picam2.create_video_configuration(main={"format": 'XRGB8888', "size": (640, 480)})) - picam2.start() - while True: - # Capture frame-by-frame - frame = picam2.capture_array() # read the camera frame - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) - ret, buffer = cv2.imencode('.jpg', frame) - frame = buffer.tobytes() - yield (b'--frame\r\n' - b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') # concat frame one by one and show result - -@app.route('/') -def index(): - return render_template('index.html') - -@app.route('/video_feed') -def video_feed(): - #Video streaming route. Put this in the src attribute of an img tag - return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame') +# 设置存储照片的目录路径 +photo_path = '/Desktop/cars/photo/' + +# 初始化摄像头 +camera = cv2.VideoCapture(-1) +camera.set(cv2.CAP_PROP_FRAME_WIDTH, 640) +camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) + +# 初始化变量 +photo_num_count = 0 +capture_lock = threading.Lock() +last_photo_time = time.time() + +# 拍照函数 +def capture_photo(): + global photo_num_count + with capture_lock: + ret, frame = camera.read() + if ret: + photo_num_count += 1 + photo_filename = f'{photo_path}photo_{photo_num_count}.jpg' + cv2.imwrite(photo_filename, frame) + print(f'{photo_num_count} photos saved. new photo: {photo_filename}') + +# 拍照请求处理 +@app.route('/photo', methods=['POST']) +def photo(): + capture_photo() + return jsonify({"status": "photo captured"}) + +# 停止请求处理 +@app.route('/stop', methods=['POST']) +def stop(): + camera.release() + print("Camera stopped") + return jsonify({"status": "camera stopped"}) if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000, debug=True) + app.run(host='0.0.0.0', port=5000) \ No newline at end of file diff --git a/carsrun/captured_photo.jpg b/carsrun/captured_photo.jpg new file mode 100644 index 0000000..a171472 Binary files /dev/null and b/carsrun/captured_photo.jpg differ diff --git a/carsrun/index-t1.html b/carsrun/index-t1.html new file mode 100644 index 0000000..901f62b --- /dev/null +++ b/carsrun/index-t1.html @@ -0,0 +1,218 @@ + + + + + + + + Live Video Based on Flask + + + + +
实时视频流
+ +

小车控制界面

+ + 小车控制 + + + +
+ + +
+
+ + +
+
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/carsrun/templates/appCam1.py b/carsrun/templates/appCam1.py new file mode 100644 index 0000000..28e2255 --- /dev/null +++ b/carsrun/templates/appCam1.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# appCam.py +# based on tutorial ==> https://blog.miguelgrinberg.com/post/video-streaming-with-flask +# PiCam Local Web Server with Flask +# MJRoBot.org 19Jan18 + +from flask import Flask, render_template, Response, redirect, url_for, send_file, jsonify, request + +# Raspberry Pi camera module (requires picamera package) +#from camera_pi import Camera +from picamera2 import Picamera2 +import os +import time +from gevent import pywsgi +from car import CAR +#from PiCamera_H264_Server import stream +import threading +import cv2 +app = Flask(__name__, static_url_path='') +# 照片保存路径 +PHOTO_PATH = "photo.jpg" + +def gen_frames(): # generate frame by frame from camera + picam2 = Picamera2() + picam2.configure(picam2.create_video_configuration(main={"format": 'XRGB8888', "size": (640, 480)})) + picam2.start() + while True: + # Capture frame-by-frame + frame = picam2.capture_array() # read the camera frame + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + ret, buffer = cv2.imencode('.jpg', frame) + frame = buffer.tobytes() + yield (b'--frame\r\n' + b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') # concat frame one by one and show result + + +@app.route('/') +def index(): + return render_template('index-t.html') + +@app.route('/video_feed') +def video_feed(): + #Video streaming route. Put this in the src attribute of an img tag + return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame') +#--------------------------------------------------------------------------------- +@app.route('/take_photo') +def take_photo(): + picam2 = Picamera2() + picam2.configure(picam2.create_video_configuration(main={"format": 'XRGB8888', "size": (640, 480)})) + picam2.start() + frame = picam2.capture_array() # Capture a single frame + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + cv2.imwrite(PHOTO_PATH, frame) # Save the frame as a JPEG file + + return send_file(PHOTO_PATH, as_attachment=True) # Send the file to download +#--------------------------------------------------------------------------------------- + +# def gen(camera): +# """Video streaming generator function.""" +# while True: +# frame = camera.get_frame() +# yield (b'--frame\r\n' +# b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') + +# @app.route('/capture') +# def capture(): +# pic = open("qrcode.png", "wb") +# frame = Camera().get_frame() +# pic.write(frame) +# return Response(b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n', +# mimetype='multipart/x-mixed-replace; boundary=frame') +# #return send_file("qrcode.png", mimetype='image/png') +# #return redirect(url_for('index')) + +# @app.route('/video_feed') +# def video_feed(): +# """Video streaming route. Put this in the src attribute of an img tag.""" +# return Response(gen(Camera()), +# mimetype='multipart/x-mixed-replace; boundary=frame') +car = CAR() +@app.route('/control/') +def control_index(): + word = """指令:\n + /stop(/Q): 小车停止运动\n + /forward(/W): 小车开始运动\n + /back(/S): 小车向后运动\n + /left(/A): 小车向左运动\n + /right(/D): 小车向右运动\n""" + print(word) + return word + +# def execute_forward_function(): +# url = "http://192.168.185.242:80/send_command" # 示例URL,实际使用时需要替换为正确的服务器地址 +# data = {"command": 'base -c {"T":1,"L":0.5,"R":0.5}'} # 请求体数据 + +# # 发送请求并打印返回结果 +# try: +# response = request.post(url, data=data) +# print(response.text) # 打印服务器返回的内容 +# except request.exceptions.RequestException as e: +# print(f"请求发生错误: {e}") +# print("执行前进功能") +# # 返回一些结果 +# return "前进功能已执行" + +# @app.route('/control/forward', methods=['GET']) +# def control_forward(): +# try: +# # 获取前端发送的数据 +# data = request.args + +# # 调试输出接收到的数据 +# print("接收到的数据:", data) + +# # 执行你的函数 +# result = execute_forward_function() # 确保这个函数是可以被调用的,如果有必要打印它的返回值 + +# # 返回JSON响应, result 需要确保是可json化的对象 +# return jsonify({ +# "resultCode": 200, +# "message": "请求成功", +# "data": result +# }) +# except Exception as e: +# print(f"发生错误: {e}") # 打印异常 +# return jsonify({"resultCode": 500, "message": "内部服务器错误"}), 500 # 返回500错误 + + + +@app.route('/control/') +def fun(info): + if hasattr(car, info): + getattr(car, info)() + return 'Run: '+info+'\n' + else: + return 'Error: '+info+' not be defined\n' + +# 新增路由处理文本传输功能 +@app.route('/send_text', methods=['POST']) +def send_text(): + try: + # 获取前端发送的数据 + data = request.form + ip = data.get('ip') + port = int(data.get('port')) + text = data.get('text') + + # 构建URL + url = "http://{}:{}/send_text".format(ip, port) + + # 发送请求 + response = requests.post(url, data={'text': text}) + + # 返回响应 + return jsonify({ + "resultCode": 200, + "message": "请求成功", + "data": response.text + }) + except Exception as e: + print(f"error: {e}") + return jsonify({"resultCode": 500, "message": "内部服务器错误"}), 500 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port =80, debug=True, threaded=True) + # t = threading.Thread(target=stream) + # t.start() + # server = pywsgi.WSGIServer(('0.0.0.0', 80), app) + # server.serve_forever() diff --git a/carsrun/templates/index-t1.html b/carsrun/templates/index-t1.html new file mode 100644 index 0000000..901f62b --- /dev/null +++ b/carsrun/templates/index-t1.html @@ -0,0 +1,218 @@ + + + + + + + + Live Video Based on Flask + + + + +
实时视频流
+ +

小车控制界面

+ + 小车控制 + + + +
+ + +
+
+ + +
+
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + + + + + + + + + + + + + \ No newline at end of file