OpenCV and Flask : Trying to send detected text to a template html file

百般思念 提交于 2020-04-18 05:28:42

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!