基于PYNQ的网络视频采集和显示
连接图
PYNQ端
功能:作为服务端,接受视频流,经过缩放后通过Hdmi out输出
from pynq.overlays.base import BaseOverlay
from pynq.lib.video import *
import socket
import time
import cv2 as cv
import numpy as np
base = BaseOverlay("base.bit")
# monitor configuration: 640*480 @ 60Hz
Mode = VideoMode(640,480,24)
hdmi_out = base.video.hdmi_out
hdmi_out.configure(Mode,PIXEL_BGR)
hdmi_out.start()
HOST = '192.168.2.99' # host ip
PORT = 1008 #端口号
BUFSIZ = 102400 #消息的最大长度
ADDR = (HOST,PORT)
tcpSerSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(10)
while True:
print('等待连接...')
tcpCliSock, addr = tcpSerSock.accept()
print('连接到:', addr)
while True:
temp = tcpCliSock.recv(BUFSIZ)
if temp is not None:
img_code = np.fromstring(temp,dtype='uint8')
if img_code is None:
continue
img = cv.imdecode(img_code,1)
if img is None:
continue
frame = cv.resize(img,(640,480))
outframe = hdmi_out.newframe()
outframe[0:480,0:640,:] = frame[0:480,0:640,:]
hdmi_out.writeframe(outframe)
tcpCliSock.close()
tcpSerSock.close()
PC端
功能:作为客户端,利用webcam采集视频,编码后利用Socket传递到PYNQ中
from socket import *
import cv2 as cv
import numpy as np
HOST = '192.168.2.99'
PORT = 1008
BUFSIZ =1024
ADDR = (HOST,PORT)
cam = cv.VideoCapture(0)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
encode_param = [int(cv.IMWRITE_JPEG_QUALITY), 50]
while cam.isOpened():
ret, img = cam.read()
img_encode = cv.imencode('.jpg', img, encode_param)[1]
data = img_encode.tostring()
tcpCliSock.send(data)
cv.imshow('sent',img)
sig = cv.waitKey(1)
if sig is ord('q'):
break
tcpCliSock.close()