#python #opencv #flask
Вопрос:
Я хочу получить сигнал с веб-камеры или камеры csi на моем jetson nano, отобразить его в веб-браузере и нажать несколько кнопок, чтобы сделать снимок, и в зависимости от кнопки разместить изображение в разных папках.
Я сделал следующий код, который, кажется, работает, но после нескольких действий с кнопками браузер начинает загружаться бесконечно. Через некоторое время веб-браузер не загружается бесконечно. Он загружается до тех пор, пока я не нажму одну из кнопок. И в этом случае я больше не могу видеть прямой сигнал с камеры, я просто вижу снимок, сделанный, когда я нажал кнопку.
from flask import Flask, render_template, Response, request import cv2 import datetime, time import os, sys import numpy as np from threading import Thread global rec_frame, Polluted, Clear, Treated, OutOfService Polluted=0 Clear=0 Treated=0 OutOfService=0 #instatiate flask app app = Flask(__name__, template_folder='./templates') #select webcam or CSI #camera = cv2.VideoCapture("nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)1280, height=(int)960,format=(string)NV12, framerate=(fraction)20/1 ! nvvidconv flip-method=0 ! video/x-raw,format=(string)BGRx ! videoconvert ! video/x-raw,width=(int)1280, height=(int)960, format=(string)BGR ! appsink" #, cv2.CAP_GSTREAMER) camera = cv2.VideoCapture(1) def snapshot(frame,folder): cropped = frame[100:400,200:500] resized = cv2.resize(cropped,(100,100)) cv2.imwrite("/home/ava/Documents/AVA/Get pictures/" folder "/frame-" time.strftime("%d-%m-%Y-%H-%M-%S") ".jpg",cv2.cvtColor(resized,cv2.COLOR_RGB2BGR)) def gen_frames(): # generate frame by frame from camera global rec_frame,Polluted,Clear,Treated,OutOfService while True: success,frame = camera.read() if success: #get snapshot if button pressed if(Polluted): snapshot(frame,"Polluted Water") Polluted = 0 if(Clear): snapshot(frame,"Cleared Water") Clear = 0 if(Treated): snapshot(frame,"Treated Water") Treated = 0 if(OutOfService): snapshot(frame,"Out of Service") OutOfService = 0 try: ret, buffer = cv2.imencode('.jpg', cv2.flip(frame,1)) frame = buffer.tobytes() yield (b'--framern' b'Content-Type: image/jpegrnrn' frame b'rn') except Exception as e: print('pass') pass else: pass @app.route('/') def index(): return render_template('index.html') @app.route('/video_feed') def video_feed(): return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame') @app.route('/requests',methods=['POST','GET']) def tasks(): global switch,camera if request.method == 'POST': if request.form.get('Polluted') == 'Polluted': global Polluted,rec_frame Polluted=1 print('in polluted') elif request.form.get('Clear') == 'Clear': global Clear Clear = 1 elif request.form.get('Treated') == 'Treated': global Treated Treated = 1 elif request.form.get('OutOfService') == 'OutOfService': global OutOfService OutOfService = 1 elif request.method=='GET': return render_template('index.html') return render_template('index.html') if __name__ == '__main__': app.run() camera.release() cv2.destroyAllWindows()
Комментарии:
1. Что показывает консоль, в которой запускается скрипт, какие-либо ошибки?
2. Ничего, никакой ошибки. Я попытался добавить печать флага («флаг») в функцию gen_frame (). Во время нормальной работы я вижу много «флагов» в консоли, когда появляется проблема, я вижу «флаг» только один раз каждый раз, когда нажимаю кнопку. Похоже, что бесконечный цикл «пока верно» больше не работает.
3. какая еще информация вам нужна?