使用OpenCV进行直播(附代码)
共 3157字,需浏览 7分钟
·
2021-11-11 13:33
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
生活中我们不止一次地使用过直播,但从未想过如何通过编程实现。大家好,我们在这里向大家介绍如何使用OpenCV和python的套接字编程。今天,我们将借助OpenCV和socket编程创建一个实时流媒体应用程序,我们将从头开始为服务器和客户端开发代码。
Opencv是一个计算机视觉库。该库具有多种功能,因此我们可以使用网络摄像头和编程来处理图像和视频。
简单地说,socket编程意味着使用TCP或UDP等互联网协议在端口上的两个或多个服务器之间进行通信。关于socket和OpenCV的更多信息,我们将在代码中讨论。
开发一个服务器
pip install packagename
opencv-python,numpy,pickle
import cv2, socket, numpy, pickle
s=socket.socket(socket.AF_INET , socket.SOCK_DGRAM)
ip="192.168.1.5"
port=6666
s.bind((ip,port))
在上面的代码中,我们已经为项目导入了所需的库。"s"变量将存储socket的地址,socket.AF_INET用于表示套接字使用ipv4。socket.sock_DGRAM表示UDP协议,代表用户数据报协议。有时使用它是有风险的,因为假设我们的数据包没有发送给用户,它不会告诉我们,所以我们有数据丢失的风险,而不是它易于使用。我们也可以使用TCP,但这会使我们的代码有点复杂,因此对于basic,我们使用UDP。
"ip"变量包含计算机的ip地址,"port"编号包含运行进程的端口。你们可以根据自己的选择提供任何端口号,因为它只是一个正在运行并暴露于世界的进程。s.bind()函数将绑定"ip"和"端口"号,并将其转换为套接字。简单地说,就是元组。
while True:
x=s.recvfrom(1000000)
clientip = x[1][0]
data=x[0]
print(data)
data=pickle.loads(data)
print(type(data))
data = cv2.imdecode(data, cv2.IMREAD_COLOR)
cv2.imshow('server', data) #to open image
if cv2.waitKey(10) == 13:
break
cv2.destroyAllWindows()
上述函数将从客户端接收数据,并将数据临时存储到"x"变量中。在"clientip"中,我们使用通过切片数组检索的数据存储了客户端的IP地址,数据变量将保存数据。现在,我们将使用函数imdecode对数据变量中接收的数据进行解码,imshow函数将显示一个流窗口。cv2.waitkey(10)将每隔10毫秒单击/收集数据,直到你们按enter键并输入数字13。按enter键时,destroyAllWindows()将关闭应用程序。
配置客户端
import cv2, socket, pickle, os
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10000000)
serverip="192.168.1.5"
serverport=6666
这里,我们首先导入了socket和OpenCV所需的库,"s"存储socket的地址。AF_INET表示IP系列v4和socket.SOCK_DGRAM此关键字用于UDP协议,第三行将创建一个缓冲区大小,以便我们可以存储数据缓冲区以连续传输数据。"serveip"和"serverport"保存服务器的IP地址和端口号。
cap = cv2.VideoCapture(0)
while True:
ret,photo = cap.read()
cv2.imshow('streaming', photo)
ret, buffer = cv2.imencode(".jpg", photo,[int(cv2.IMWRITE_JPEG_QUALITY),30])
x_as_bytes = pickle.dumps(buffer)
s.sendto(x_as_bytes,(serverip , serverport))
if cv2.waitKey(10) == 13:
break
cv2.destroyAllWindows()
cap.release()
视频捕获(0)存储功能地址和用于存储网络摄像头的"0"。ret存储返回值和照片,并存储cap.read()的输出。此函数将读取图像。imshow将显示流媒体窗口。缓冲区变量将存储流媒体的数据并将其提供给服务器,这个函数将把数据转储到一个变量中,发送到一个函数将绑定IP和端口号的数据,以便我们可以发送它。waitkey将每隔10毫秒收集一次数据,直到我们按enter键,输入代码为13。destroyAllWindows()将销毁windows,cap.release()将关闭相机。
本文GITHUB代码链接:
https://github.com/abhikesare9/live-streaming-with-opencv
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~