提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本开源项目分为客户端和服务端,客户端安装到局域网内带摄像头的电脑上,服务端安装到自己的电脑上😏
客户端获取摄像头数据
服务端接收摄像头数据并显示
基础可以看我以前的文章
https://blog.csdn.net/qq_39641107/article/details/121307602?spm=1001.2014.3001.5501
https://blog.csdn.net/qq_39641107/article/details/121612465?spm=1001.2014.3001.5501
一、客户端
功能介绍
客户端安装到局域网内带摄像头的电脑上,输入服务端主机ip,连接服务端,即可将摄像头拍的视频传输给服务端
程序
# ==========================内置库==========================
import sys
import json
import base64
# ==========================PyQt5==========================
import cv2
from PyQt5.QtCore import pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QPixmap
#===========================================================
import numpy as np
#===========================自定义===========================
from ui_mainwindow import Ui_MainWindow
from tcpcommunication import TcpClient
from Camera import ShowVideo
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.__init_dispaly()
#初始化
def __init_dispaly(self):
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.__init_video()
self.__init_tcp()
self.__init_StyleSheet()
def __init_tcp(self):
self.my_tcpclient = TcpClient()
self.my_tcpclient.serverdata.connect(self.do_serverdata)
self.my_tcpclient.flaseconnect.connect(self.do_reconnection)
def __init_video(self):
self.img = None
self.qImg = None
self.sendimage = None
self.firstsend = True
self.my_showvideo = ShowVideo(self)
self.my_showvideo.imageReady.connect(self.Imgupdate)
def __init_StyleSheet(self):
self.setStyleSheet(
"QWidget{background:none;color:rgba(2, 203, 255, 0.8);font-family:微软雅黑}"
"QLabel{border: 2px solid}"
"QPushButton{background:rgba(2, 203, 255, 255);color:rgba(255, 255, 255, 0.8);}"
)
# 处理接收的数据
def do_serverdata(self, recvdata):
try:
self.serverdatatcp = json.loads(recvdata["data"].decode('utf-8'))
if self.serverdatatcp["type"] == "open":
self.my_showvideo.start()
elif self.serverdatatcp["type"] == "close":
self.my_showvideo.terminate()
if self.my_showvideo.cap:
self.my_showvideo.cap.release()
if self.serverdatatcp["type"] == "true":
self.my_tcpclient.tcpsend(self.sendimage)
except Exception as e:
print(e, "接收数据格式错误!")
#重新连接
def do_reconnection(self):
self.my_showvideo.terminate()
if self.my_showvideo.cap:
self.my_showvideo.cap.release()
self.my_tcpclient.terminate()
self.my_tcpclient.serversocket.close()
self.ui.button_open.setText("连接断开,重新连接")
# 更新图像
def Imgupdate(self):
minqimg = self.qImg.scaled(350, 350)
self.ui.label_video.setPixmap(minqimg)
jpg_as_bytes = base64.b64encode(self.img)
# jpg_as_bytes是bytes对象
# bytes对象同样不能进行json序列化
jpg_as_str = jpg_as_bytes.decode('ascii')
senddata = {
"height": self.img.shape[0],
"wight": self.img.shape[1],
"sendimg": jpg_as_str
}
self.sendimage = json.dumps(senddata)
if self.firstsend:
self.my_tcpclient.tcpsend(self.sendimage)
self.firstsend = False
@pyqtSlot(name="on_button_open_clicked")
def on_button_open_clicked(self):
ip = self.ui.line_ip.text()
port = int(self.ui.line_port.text())
if self.my_tcpclient.init_tcpset(ip, port):
self.my_tcpclient.start()
self.ui.button_open.setText("连接成功")
self.firstsend = True
else:
self.ui.button_open.setText("连接失败,重新连接")
@pyqtSlot(name="on_button_close_clicked")
def on_button_close_clicked(self):
self.my_showvideo.terminate()
if self.my_showvideo.cap:
self.my_showvideo.cap.release()
self.my_tcpclient.terminate()
self.my_tcpclient.serversocket.close()
self.ui.button_open.setText("连接断开,重新连接")
def __del__(self):
self.my_showvideo.terminate()
if self.my_showvideo.cap:
self.my_showvideo.cap.release()
self.my_tcpclient.terminate()
二、服务端
功能介绍
服务端打开摄像头,即可打开客户端所在电脑的摄像头进行监控。
程序
# ==========================PyQt5==========================
import cv2
from PyQt5 import QtGui
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5.Qt import Qt, QTimer, QPainter, QFont
from PyQt5.QtCore import pyqtSlot, pyqtSignal, QDateTime
from PyQt5.QtChart import *
from PyQt5.QtWidgets import QApplication
#===========================二维码及人脸======================
import qrcode
from PIL import ImageQt, Image, ImageFont, ImageDraw
from pyzbar import pyzbar as pyzbar
import numpy as np
#===========================自定义===========================
from ui_mainwindow import Ui_MainWindow
from tcpcommunication import TcpCommunication, TcpCommunicationReceiver, TcpClient
from Camera import ShowVideo
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.__init_dispaly()
#初始化
def __init_dispaly(self):
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.__init_tcp()
self.__init_StyleSheet()
def __init_tcp(self):
self.socklist = []
self.mytcp = TcpCommunication(self.socklist)
self.mytcp.init_tcpset()
self.mytcp.start()
self.mytcpreceiver = TcpCommunicationReceiver(self.socklist)
self.mytcpreceiver.revdata.connect(self.do_receiverdata)
self.mytcpreceiver.start()
def __init_StyleSheet(self):
self.setStyleSheet(
"QWidget{background:none;color:rgba(2, 203, 255, 0.8);font-family:微软雅黑}"
"QLabel{border: 2px solid}"
"QPushButton{background:rgba(2, 203, 255, 255);color:rgba(255, 255, 255, 0.8);}"
)
# 处理接收的数据
def do_receiverdata(self, recvdata):
self.ui.label_video.setPixmap(recvdata["data"].toqpixmap())
self.mytcp.tcpsend('{"type":"true"}')
@pyqtSlot(name="on_button_open_clicked")
def on_button_open_clicked(self):
self.mytcp.tcpsend('{"type":"open"}')
@pyqtSlot(name="on_button_close_clicked")
def on_button_close_clicked(self):
self.mytcp.tcpsend('{"type":"close"}')
# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
总结
详细程序见https://download.csdn.net/download/qq_39641107/54824347
或者点赞加粉丝,评论区发邮箱,我发给你
如有错误希望请大家指导,谢谢点赞!
希望和大家一起学习,交流