问题
I am new to flask and I was trying to get my openCV webcam program to send data to a flask server. However, after several tries, I was unable to do the same. My aim is to send data from webcam to a flask server. Here is the code I tried using:
import os
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
import copy
import cv2
import requests
API_ENDPOINT = "http://127.0.0.1:5000/"
from flask import jsonify, Flask, make_response,request, render_template
from flask_restful import Resource, Api
# creating the flask app
app = Flask(__name__)
# creating an API object
api = Api(app)
# Disable tensorflow compilation warnings
@app.route("/", methods=['POST','GET'])
def get():
data = request.form["data"]
return make_response(render_template("text.html", text = data))
if __name__ == '__main__':
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
global_sol = []
def predict(image_data):
predictions = sess.run(softmax_tensor, \
{'DecodeJpeg/contents:0': image_data})
# Sort to show labels of first prediction in order of confidence
top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]
max_score = 0.0
res = ''
for node_id in top_k:
human_string = label_lines[node_id]
score = predictions[0][node_id]
if score > max_score:
max_score = score
res = human_string
return res, max_score
# Loads label file, strips off carriage return
label_lines = [line.rstrip() for line
in tf.gfile.GFile("logs/output_labels.txt")]
# Unpersists graph from file
with tf.gfile.FastGFile("logs/output_graph.pb", 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
_ = tf.import_graph_def(graph_def, name='')
with tf.Session() as sess:
# Feed the image_data as input to the graph and get first prediction
softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
c = 0
cap = cv2.VideoCapture(0)
res, score = '', 0.0
i = 0
mem = ''
consecutive = 0
sequence = ''
while True:
ret, img = cap.read()
img = cv2.flip(img, 1)
if ret:
x1, y1, x2, y2 = 100, 100, 300, 300
img_cropped = img[y1:y2, x1:x2]
c += 1
image_data = cv2.imencode('.jpg', img_cropped)[1].tostring()
a = cv2.waitKey(1) # waits to see if `esc` is pressed
if i == 4:
res_tmp, score = predict(image_data)
data = {"data": res_temp}
requests.post(url = API_ENDPOINT, data = data)
i = 0
if mem == res:
consecutive += 1
else:
consecutive = 0
if consecutive == 2 and res not in ['nothing']:
if res == 'space':
sequence += ' '
elif res == 'del':
sequence = sequence[:-1]
else:
sequence += res
sequence_text = sequence
global_sol.append(sequence)
consecutive = 0
i += 1
cv2.putText(img, '%s' % (res.upper()), (100,400), cv2.FONT_HERSHEY_SIMPLEX, 4, (255,255,255), 4)
cv2.putText(img, '(score = %.5f)' % (float(score)), (100,450), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255))
mem = res
cv2.rectangle(img, (x1, y1), (x2, y2), (255,0,0), 2)
cv2.imshow("img", img)
img_sequence = np.zeros((200,1200,3), np.uint8)
cv2.putText(img_sequence, '%s' % (sequence.upper()), (30,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2)
cv2.imshow('sequence', img_sequence)
if a == 27: # when `esc` is pressed
break
cv2.destroyAllWindows()
cv2.VideoCapture(0).release()
app.run(debug=True)
Output:
I can see that my webcam opens, however, it is not responding.
Expected Output :
Data is sent from webcam to the flask server.
I am using requests to send a POST request to a flask path. Any help will be appreciated. Thanks in advance (y)
来源:https://stackoverflow.com/questions/60780228/opencv-and-flask-trying-to-send-detected-text-to-a-template-html-file