Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 通过Flask_socketIO向客户端发送openCV图像会导致TypeError:ndarray类型的对象不可JSON序列化_Python 3.x_Opencv_Flask_Socket.io_Flask Socketio - Fatal编程技术网

Python 3.x 通过Flask_socketIO向客户端发送openCV图像会导致TypeError:ndarray类型的对象不可JSON序列化

Python 3.x 通过Flask_socketIO向客户端发送openCV图像会导致TypeError:ndarray类型的对象不可JSON序列化,python-3.x,opencv,flask,socket.io,flask-socketio,Python 3.x,Opencv,Flask,Socket.io,Flask Socketio,我有一个base64映像正在从浏览器发送到flask服务器。当服务器获取base64字符串时,它会将其转换为OpenCV的格式: image = '{}'.format(image64).split(',')[1] im_bytes = base64.b64decode(image) im_arr = np.frombuffer(im_bytes, dtype=np.uint8) # im_arr is one-dim Numpy array frame = cv2.imdecode(im_

我有一个base64映像正在从浏览器发送到flask服务器。当服务器获取base64字符串时,它会将其转换为OpenCV的格式:

image = '{}'.format(image64).split(',')[1]

im_bytes = base64.b64decode(image)
im_arr = np.frombuffer(im_bytes, dtype=np.uint8)  # im_arr is one-dim Numpy array
frame = cv2.imdecode(im_arr, flags=cv2.IMREAD_COLOR)
在帧上进行一些处理,然后使用flask_signalio将其发送回浏览器,使用:

encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]
result, encimg = cv2.imencode('.jpg', updated_frame, encode_param)
socketio.emit('response_back', {'image_data': encimg}, namespace='/test')
在浏览器中,我有一些JS来显示它接收到的图像:

socket.on('response_back', function(image){
    ....
});
我有两个问题

  • 调用
    socketio.emit('response_back',{'image_data':encimg},namespace='/test')
    会导致服务器上出现异常:
    TypeError:ndarray类型的对象不可JSON序列化
  • 我怎样才能解决这个问题?这里怎么了?这很奇怪,因为我确信我正确地发送了数据,如图和所示。我还尝试将SocketIO设置为使用二进制数据:
    SocketIO=SocketIO(app,binary=True)
    。什么都不管用。总是同样的错误

  • 如何处理客户端/浏览器上的图像数据?(即在
    插座中打开('response\u back',函数(图像)
    code)

  • 将近一个小时后,我找到了解决办法

    首先,flask_socketio可以发送字节数据,但不能发送ndarray!解决方案是使用
    .tobytes()
    对字节进行编码。例如,在服务器上:

    encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]
    result, encimg = cv2.imencode('.jpg', updated_frame, encode_param)
    socketio.emit('response_back', {'frame': encimg.tobytes()}, namespace='/test')
    
    对于第二个问题,我们需要转换ArrayBuffer数据:

    var arrayBufferView = new Uint8Array( result.frame );
    var blob = new Blob( [ arrayBufferView ], { type: "image/jpeg" } );
    var urlCreator = window.URL || window.webkitURL;
    var imageUrl = urlCreator.createObjectURL( blob );
    var image_id = document.getElementById('imagebox');
    image_id.src = imageUrl;