【ZED-2】基于WebSockets库,通过多线程方式推送数据流

 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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值