前期实验需要图像远程传输,一直使用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()

注意事项:

  1. 发送端设备与接收端设备需要在同一局域网下
  2. 发送端和接收端的 ip地址 需要一致且都为发送端的ip
  3. 发送端和接收端的 port端口号需一致且未被占用即可
  4. 发送端与接受端的延迟在 1s左右
  5. 运行时,先启动发送端程序,之后启动接受端程序