打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用OpenCV进行直播(附代码)

重磅干货,第一时间送达

生活中我们不止一次地使用过直播,但从未想过如何通过编程实现。大家好,我们在这里向大家介绍如何使用OpenCV和python的套接字编程。今天,我们将借助OpenCV和socket编程创建一个实时流媒体应用程序,我们将从头开始为服务器和客户端开发代码。

什么是OpenCV?

Opencv是一个计算机视觉库。该库具有多种功能,因此我们可以使用网络摄像头和编程来处理图像和视频。

什么是socket编程?

简单地说,socket编程意味着使用TCP或UDP等互联网协议在端口上的两个或多个服务器之间进行通信。关于socket和OpenCV的更多信息,我们将在代码中讨论。

开发一个服务器

在服务器上,当客户端连接到服务器时,应用程序将以端口号和IP地址运行,然后服务器接收数据并将其转换为流。在运行代码之前,请确保你们已经下载了python中的以下库:
pip install packagename

opencv-python,numpy,pickle

import cv2, socket, numpy, pickles=socket.socket(socket.AF_INET , socket.SOCK_DGRAM)ip="192.168.1.5"port=6666s.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: breakcv2.destroyAllWindows()

上述函数将从客户端接收数据,并将数据临时存储到"x"变量中。在"clientip"中,我们使用通过切片数组检索的数据存储了客户端的IP地址,数据变量将保存数据。现在,我们将使用函数imdecode对数据变量中接收的数据进行解码,imshow函数将显示一个流窗口。cv2.waitkey(10)将每隔10毫秒单击/收集数据,直到你们按enter键并输入数字13。按enter键时,destroyAllWindows()将关闭应用程序。

配置客户端

现在,当我们将客户端连接到给定的服务器IP和端口号时,它们之间的通信开始。
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

下载1:OpenCV-Contrib扩展模块中文版教程
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
利用OpenCV、Python和Ubidots构建行人计数器程序(附代码&解析)
opencv小项目练习之数独求解
OpenCV-Python中没有Mat.convertTo函数怎么办?
TCP/IP UDP
opencv实现ROI(c版)
5分钟!教你用C语言发送邮件:附送源码+教学!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服