内网图像传输 opencv+socket
前期实验需要图像远程传输,一直使用rtmp推流传输,但由于 rtmp 推流延迟过高,需要降低延时,本程序通过内网 opencv采集socket发送实现内网图像传输,延时较低,大约1s左右,初步能实现相关功能。
内网图像传输 opencv+socket
发送端(板子)程序
发送端(板子)程序,通过opencv采集图像,然后通过socket发送出去
import cv2
import socket
import numpy as np
cap = cv2.VideoCapture(10)
# 设置图像宽高
v_width=640
v_height=480
# ip 与端口
port = 12346
ip="192.168.1.106"
cap.set(3,v_width) # set Width
cap.set(4,v_height) # set Height
s = socket.socket()
img_param = [int(cv2.IMWRITE_JPEG_QUALITY), 95]#opencv 图像清晰度,帧数
#绑定ip地址和端口
s.bind((ip,port))
s.listen(5) #等待客户机连接
c,addr = s.accept() #接受客户机连接
while True:
ret,frame = cap.read()
frame = cv2.resize(frame, (v_width,v_height))
print("连接地址:"+addr[0])
_, img_encode = cv2.imencode('.jpg', frame, img_param)#opencv图像编码
img_code = np.array(img_encode)
img_data = img_code.tostring()#将数组格式转为字符串格式
# print(img_data)
c.send(bytes(str(len(img_data)).ljust(16),encoding="utf8"))# 先发送数据的长度
c.send(img_data)#再发送数据内容
cv2.imshow("主机",frame)
if cv2.waitKey(1)==27:
c.close()
break
cap.release()
cv2.destroyAllWindows()
接受端程序
接受发送端采集的图像信息,并在接收端展示出来
import socket
import cv2
import numpy as np
import gzip
port = 12346
ip="192.168.1.106"
def recv_all(s,count):
buf=bytes()
while count:
newbuf = s.recv(count)
if not newbuf:return None
buf+=newbuf
count-=len(newbuf)
return buf
s = socket.socket()
host = socket.gethostname()
while True:
try:
s.connect(("192.168.1.106",port))
except:
print("有错误")
else:
break
while True:
data_len = recv_all(s,16)
if len(data_len) == 16:
stringData = recv_all(s, int(data_len))
data = np.fromstring(stringData, dtype='uint8')
tmp = cv2.imdecode(data, 1) # 解码处理,返回mat图片
img = cv2.resize(tmp, (1344, 768))
cv2.imshow('客户机', img)
if cv2.waitKey(1) == 27:
break
s.close()
注意事项:
- 发送端设备与接收端设备需要在同一局域网下
- 发送端和接收端的 ip地址 需要一致且都为发送端的ip
- 发送端和接收端的 port端口号需一致且未被占用即可
- 发送端与接受端的延迟在 1s左右
- 运行时,先启动发送端程序,之后启动接受端程序