Python+WebSocket+Nodejs实现在网页中显示相机采集到的图像数据

在之前的Python+WebSocket+Nodejs实现在网页中显示图像数据基础上修改的

只改了Python脚本的代码,就是把之前从本地读取图像文件换成了从相机获取采集的图像

import asyncio
import websockets
import base64
from cv2 import cv2
import numpy as np
import time
from dvp import *


cameraInfo = Refresh();                                 #刷新并获取相机列表
camera = Camera(0)
camera.TriggerState = False                         #从触发模式切换到连续出图模式
camera.Start()                                      #启动视频流

def frame2mat(frameBuffer):
    frame, buffer = frameBuffer
    bits = np.uint8 if(frame.bits == Bits.BITS_8) else np.uint16
    shape = None
    convertType = None
    if(frame.format >= ImageFormat.FORMAT_MONO and frame.format <= ImageFormat.FORMAT_BAYER_RG):
        shape = 1
    elif(frame.format == ImageFormat.FORMAT_BGR24 or frame.format == ImageFormat.FORMAT_RGB24):
        shape = 3
    elif(frame.format == ImageFormat.FORMAT_BGR32 or frame.format == ImageFormat.FORMAT_RGB32):
        shape = 4
    else:
        return None

    mat = np.frombuffer(buffer, bits)
    mat = mat.reshape(frame.iHeight, frame.iWidth, shape)   #转换维度
    return mat

# 向服务器端实时发送视频流帧数据
async def send_msg(websocket):
    while 1:
        frame = camera.GetFrame(4000)                   #从相机采集图像数据,超时时间为4000毫秒

        mat = frame2mat(frame)                              #转换为标准数据格式

        mat=cv2.resize(mat,(640,480))

        #cv2.namedWindow(u"Camera",0)#可以拖动窗口大小
        #cv2.resizeWindow(u"Camera", 640, 480)#设置窗口大小
        #cv2.moveWindow(u"Camera",1200,500)#设置窗口位置
        #cv2.imshow(u"Camera", mat)        #显示图像数据
            
        img_encode = cv2.imencode('.jpg', mat)[1]# '.jpg'表示把图像数据以jpg格式编码

        #cv2.waitKey(1)

        data = np.array(img_encode)
        img = data.tostring()

        # 以base64进行编码并发送给服务端
        img = base64.b64encode(img).decode()
        await websocket.send("data:image/jpeg;base64,"+img)

# 客户端主逻辑
async def main_logic():
    async with websockets.connect('ws://127.0.0.1:3303') as websocket:
        await send_msg(websocket)

asyncio.get_event_loop().run_until_complete(main_logic())

 测试了一下,用的是130万像素相机,全分辨率下显示的图像会有大概2秒的延迟,分辨率缩放成一半后基本看不出延迟显示效果也很流畅

不敢开F12开发者工具,开了卡的飞起

猜你喜欢

转载自blog.csdn.net/qq_36917144/article/details/117300708#comments_22029779