如何使用OpenCV和Socket进行视频聊天?_OpenCV

 

一、简介

 

在本文中,我们要构建的是视频聊天,但话音通道使用的OpenCV和Python中的Socket。流程:

  • 创建用于一对一通信的 TCP 套接字。

  • 从相机中获取实时流。

  • 对双工通道使用多线程。

 

OpenCV是使用Python进行图像和视频处理的库,它做任何与图像和视频相关的事情:裁剪、编辑、创建图像和制作视频。Socket是一种低级网络接口,用于连接网络上的两个节点以进行通信,线程是用于在python中创建多线程程序的库。

 

二、步骤

 

首先,我们将使用以下代码使用Socket库创建TCP Socket:

  • 将协议设置为 TCP,将地址族设置为 IPv4 地址族。

  •  
# tcp and ipv4 address familytcp = socket.SOCK_STREAMafm = socket.AF_INET
  • 使用 TCP 和 AFM 变量创建Socket。

  •  
# creating socketsa = socket.socket(afm,tcp)sb = socket.socket(afm,tcp)

sa和sb是创建用于在两个节点之间进行通信的Socket。我们也可以使用单个Socket来实现相同的目的。

 

  • 绑定IP地址和端口号。

  •  
sa.bind((usera_ip,usera_port))
  • 开始监听Socket。

  •  
sa.listen()
  • 开始接受来自节点的连接。

  •  
session, addr = sa.accept()

sa.accept()用于接受来自其他节点的连接请求。session存储会话数据并使用它来发送和接收请求,而addr用于存储接收节点的地址。

 

  • 将此节点连接到另一个节点。

  •  
sb.connect((usera_ip,2001))

 

然后,我们需要设计复杂的接收和发送来接收和发送视频。

如何使用OpenCV和Socket进行视频聊天?_OpenCV_02

receive()函数包括使用以下代码块接收视频帧的无限循环。

 

session.recv(buff_size)用于从节点接收字节数组,np.frombuffer()用于存储与所述字节回numpy的arraay np.uint8数据类型的存储的0〜255然后,将范围内值cv2.imdecode(image_arr,cv2.IMREAD_COLOR)被用于使用cv2.IMREAD_COLOR参数将图像解码回彩色图像。

 

如果图像为空且数据类型为Nonetype,则程序将通过或使用cv2.imshow(image_name, image)连续显示帧,并使用cv2.waitKey(10)使帧等待 10 毫秒并退出。cv2.destroyAllWindows()用于完全销毁图像窗口并使用os._exit(0)退出线程。

 

send()函数包括使用以下代码块发送视频帧的无限循环。

如何使用OpenCV和Socket进行视频聊天?_OpenCV_03

cv2.VideoCapture(0)用于访问摄像头,并且可以使用作为参数传递的数字来更改摄像头。capture存储相机访问方法,如read()来自相机的输入或release()是相机。

 

capture.read()返回两个变量,第一个作为布尔值,要么是照片,要么是真假,第二个是照片。然后,如果ret为True,则使用imencode('.jpg',photo)对图像进行编码,并返回两个变量和第二个变量作为编码数组,并使用.tobytes转换为字节,该字节可以通过Socket发送。

 

sendall(byte_encoded_array)通过Socket发送所有数据并将数据发送到目标节点,直到所有数据成功发送到目标节点。

如何使用OpenCV和Socket进行视频聊天?_OpenCV_04

我们需要使用thread.Thread(target=func)创建用于同时接收和发送视频的线程,目标为send()和receive()为单独的线程提供函数。

如何使用OpenCV和Socket进行视频聊天?_OpenCV_05

 

项目链接:
https://github.com/Launchpad5682/summer_training_21/tree/main/task_3

 

 

 

如何使用OpenCV和Socket进行视频聊天?_OpenCV_06