Python 3.x 通过Flask_socketIO向客户端发送openCV图像会导致TypeError:ndarray类型的对象不可JSON序列化
我有一个base64映像正在从浏览器发送到flask服务器。当服务器获取base64字符串时,它会将其转换为OpenCV的格式: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_
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(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;