在之前的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开发者工具,开了卡的飞起