Отправка изображения opencv вместе с дополнительными данными на Flask Server - PullRequest
0 голосов
/ 16 сентября 2018

В настоящее время я могу отправлять рамки изображений OpenCV на свой Flask Server, используя следующий код

def sendtoserver(frame):
    imencoded = cv2.imencode(".jpg", frame)[1]
    headers = {"Content-type": "text/plain"}
    try:
        conn.request("POST", "/", imencoded.tostring(), headers)
        response = conn.getresponse()
    except conn.timeout as e:
        print("timeout")


    return response

Но я хочу отправить unique_id вместе с фреймом. Я пытался объединить фрейм и идентификатор с помощью JSON, но получаю следующее сообщение об ошибке TypeError: Object of type 'bytes' is not JSON serializable Кто-нибудь знает, как я могу отправить некоторые дополнительные данные вместе с фреймом на сервер? .

ОБНОВЛЕНИЕ:

код формата json

def sendtoserver(frame):
    imencoded = cv2.imencode(".jpg", frame)[1]
    data = {"uid" : "23", "frame" : imencoded.tostring()}
    headers = {"Content-type": "application/json"}
    try:
        conn.request("POST", "/", json.dumps(data), headers)
        response = conn.getresponse()
    except conn.timeout as e:
        print("timeout")


    return response

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Как и предполагали другие, кодировка base64 может быть хорошим решением, однако, если вы не можете или не хотите этого, вы можете добавить в запрос собственный заголовок, такой как

headers = {"X-my-custom-header": "uniquevalue"}

Затем на стороне колбы:

unique_value = request.headers.get('X-my-custom-header')

или

unique_value = request.headers['X-my-custom-header']

Таким образом, вы избегаете дополнительных затрат на обработку данных изображения снова (если это имеет значение) и можете генерировать уникальный идентификатор для каждого кадра с помощью чего-то вроде модуля python uuid .

Надеюсь, это поможет

0 голосов
/ 17 сентября 2018

Я фактически решил запрос, используя модуль Python запросы вместо модуля http.client, и внес следующие изменения в мой код выше.

import requests
def sendtoserver(frame):
    imencoded = cv2.imencode(".jpg", frame)[1]
    file = {'file': ('image.jpg', imencoded.tostring(), 'image/jpeg', {'Expires': '0'})}
    data = {"id" : "2345AB"}
    response = requests.post("http://127.0.0.1/my-script/", files=file, data=data, timeout=5)
    return response

Поскольку я пытался отправить модуль multipart / form-data и запросы, он может отправлять как файлы, так и данные в одном запросе.

0 голосов
/ 16 сентября 2018

Вы можете попробовать закодировать ваше изображение в строку base64

import base64

with open("image.jpg", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read())

и отправить его как обычную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...