python实现websockets功能_WXG1011的博客-CSDN博客
上一篇博客【ZED2-1】ZED2通过ip方式远程连接_WXG1011的博客-CSDN博客已经实现通过ip方式连接ZED2,这篇博客主要实现将服务端的结果数据推送至前端,前端可同时展示视频流及接收后端推送的数据流,这里采用websockets库及多线程的方式。
需求:1、nx板连接ZED2;
2、工作站通过ip方式连接ZED2,接收视频流,并进行算法处理,将检测结果返回nx;
3、nx接收到数据流后,并进行可视化展示。
nx板代码:
import pyzed.sl as sl
import cv2
import asyncio
import websockets
import threading
receive_data = "hello"
def main():
init = sl.InitParameters()
init.camera_resolution = sl.RESOLUTION.HD720
init.depth_mode = sl.DEPTH_MODE.NONE
cam = sl.Camera()
status = cam.open(init)
if status != sl.ERROR_CODE.SUCCESS:
print(repr(status))
exit(1)
runtime = sl.RuntimeParameters()
mat = sl.Mat()
stream = sl.StreamingParameters()
stream.codec = sl.STREAMING_CODEC.H264
stream.bitrate = 4000
status = cam.enable_streaming(stream)
if status != sl.ERROR_CODE.SUCCESS:
print(repr(status))
exit(1)
print(" Quit : CTRL+C\n")
while True:
err = cam.grab(runtime)
if (err == sl.ERROR_CODE.SUCCESS):
cam.retrieve_image(mat, sl.VIEW.LEFT)
cv2.putText(mat.get_data(), receive_data, (20, 50), cv2.FONT_HERSHEY_PLAIN, 2.0, (255, 0, 0), 2)
cv2.imshow("receiver", mat.get_data())
key = cv2.waitKey(1)
else:
key = cv2.waitKey(1)
cam.disable_streaming()
cam.close()
async def hello(websocket, path):
global receive_data
async for message in websocket:
receive_data = message
print('server received :', receive_data)
# await websocket.send(bb)
def serverRun():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
ws_server = websockets.serve(hello, '*.*.*.*', '8080')
loop.run_until_complete(ws_server)
loop.run_forever()
if __name__ == "__main__":
threads = [threading.Thread(target=main), threading.Thread(target=serverRun)]
for t in threads:
t.start()
for t in threads:
t.join()
工作站代码:
# !/usr/bin/env python3.6
import asyncio
import websockets
import threading
import pyzed.sl as sl
import cv2
import time
async def msg():
async with websockets.connect('ws://*.*.*.*:8080') as websocket:
while True:
for i in range(100):
data = "send" + str(i)
await websocket.send(data)
# 设置时延
time.sleep(0.1)
# msg = await websocket.recv()
# print(msg)
def serverRun():
loop = asyncio.new_event_loop()
loop.run_until_complete(msg())
loop.run_forever()
def main():
cam = sl.Camera()
init = sl.InitParameters()
init.camera_resolution = sl.RESOLUTION.HD720
init.depth_mode = sl.DEPTH_MODE.PERFORMANCE
init.set_from_stream("*.*.*.*")
status = cam.open(init)
if status != sl.ERROR_CODE.SUCCESS:
print(repr(status))
exit(1)
runtime = sl.RuntimeParameters()
mat = sl.Mat()
print(" Quit : CTRL+C\n")
while True:
err = cam.grab(runtime)
if (err == sl.ERROR_CODE.SUCCESS):
cam.retrieve_image(mat, sl.VIEW.LEFT)
cv2.imshow("sender", mat.get_data())
key = cv2.waitKey(1)
else:
key = cv2.waitKey(1)
cam.close()
if __name__ == '__main__':
threads = [threading.Thread(target=main), threading.Thread(target=serverRun)]
for t in threads:
t.start()
for t in threads:
t.join()
注:从服务端推送数据至nx板,在nx板展示时,明显感觉有时延,解决方法:1、在websockets send数据后添加time.sleep(0.1)设置时延可有效解决;2、将nx、服务器、第三方客户端部署在同一局域网。
参考链接 opencv读取usb摄像头通过websockets传输给前端实现低延时画面展示_xuan196的博客-CSDN博客
测试效果图:
问题一:
websockets.exceptions.ConnectionClosed:WebSocket连接已关闭:代码= 1006(连接异常关闭[内部]),没有原因
解决方法:在connect中添加另一个kw参数:
websockets.connect('ws://*.*.*.*:9000', ping_interval=None)
服务器端功能serve也应使用相同的参数
websockets.serve(hello, '*.*.*.*', '9000', ping_interval=None)