代码之家  ›  专栏  ›  技术社区  ›  Mohd Shibli

将opencv图像和其他数据发送到Flask服务器

  •  0
  • Mohd Shibli  · 技术社区  · 6 年前

    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
    

    但是我想发送一个唯一的\u id和一个框架,我尝试使用JSON将框架和id结合起来,但是出现了以下错误 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 回复  |  直到 6 年前
        1
  •  9
  •   Mohd Shibli    6 年前

    实际上,我已经用Python解决了这个查询 requests 模块而不是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
    

    当我试图发送一个多部分/表单数据和请求模块时,它能够在一个请求中同时发送文件和数据。

        2
  •  0
  •   Alejandro Quintanar    6 年前

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

    作为普通字符串发送。

        3
  •  0
  •   rb4    6 年前

    正如其他人建议的那样,base64编码可能是一个很好的解决方案,但是如果您不能或不想这样做,您可以向请求添加一个自定义头,例如

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

    然后在烧瓶侧:

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

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

    uuid

    希望有帮助