12月首发,QT开源项目(局域网电脑摄像头)-opencv+tcp+PIL

5 篇文章 0 订阅
2 篇文章 0 订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

12月首发!QT开源项目(局域网电脑摄像头)-opencv+tcp+PIL


前言

本开源项目分为客户端和服务端,客户端安装到局域网内带摄像头的电脑上,服务端安装到自己的电脑上😏
客户端获取摄像头数据
服务端接收摄像头数据并显示

基础可以看我以前的文章
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
或者点赞加粉丝,评论区发邮箱,我发给你
如有错误希望请大家指导,谢谢点赞!
希望和大家一起学习,交流

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值