python实现opencv+scoket网络实时图传


Posted in Python onMarch 20, 2020

本文实例为大家分享了python实现opencv+scoket网络实时图传的具体代码,供大家参考,具体内容如下

服务器分析:

1. 先通过在服务器端利用OpenCV捕获到视频的每一帧图片

2. 将这些图片进行压缩成JPEG格式,这样能减小图片大小,便于传输

3. 按照提前协商好的分辨率和帧数进行打包编码传输

4. 利用服务器端打开端口8880,此时客户端连接后,便可以在客户端中捕获到服务器端的视频。

#服务端
import socket
import threading
import struct
import time
import cv2
import numpy

class Carame_Accept_Object:
  def __init__(self,S_addr_port=("",8880)):
    self.resolution=(640,480)    #分辨率
    self.img_fps=15         #每秒传输多少帧数
    self.addr_port=S_addr_port
    self.Set_Socket(self.addr_port)

  #设置套接字
  def Set_Socket(self,S_addr_port):
    self.server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    self.server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #端口可复用
    self.server.bind(S_addr_port)
    self.server.listen(5)
    #print("the process work in the port:%d" % S_addr_port[1])


def check_option(object,client):
  #按格式解码,确定帧数和分辨率
  info=struct.unpack('lhh',client.recv(8))
  if info[0]>888:
    object.img_fps=int(info[0])-888     #获取帧数
    object.resolution=list(object.resolution)
    # 获取分辨率
    object.resolution[0]=info[1]
    object.resolution[1]=info[2]
    object.resolution = tuple(object.resolution)
    return 1
  else:
    return 0

def RT_Image(object,client,D_addr):
  if(check_option(object,client)==0):
    return
  camera=cv2.VideoCapture(0)                #从摄像头中获取视频
  img_param=[int(cv2.IMWRITE_JPEG_QUALITY),object.img_fps] #设置传送图像格式、帧数
  while(1):
    time.sleep(0.1)       #推迟线程运行0.1s
    _,object.img=camera.read() #读取视频每一帧

    object.img=cv2.resize(object.img,object.resolution)   #按要求调整图像大小(resolution必须为元组)
    _,img_encode=cv2.imencode('.jpg',object.img,img_param) #按格式生成图片
    img_code=numpy.array(img_encode)            #转换成矩阵
    object.img_data=img_code.tostring()           #生成相应的字符串
    try:
      #按照相应的格式进行打包发送图片
      client.send(struct.pack("lhh",len(object.img_data),object.resolution[0],object.resolution[1])+object.img_data)
    except:
      camera.release()    #释放资源
      return

if __name__ == '__main__':
  camera=Carame_Accept_Object()
  while(1):
    client,D_addr=camera.server.accept()
    clientThread=threading.Thread(None,target=RT_Image,args=(camera,client,D_addr,))
    clientThread.start()

客户端分析:

1. 客户端连接端口后,首先发送需要协商的分辨率和帧数,以致能够使传输“协议”一致

2. 客户端使用线程,对图片进行收集

3. 对收到的每一张图片进行解码,并利用OpenCV播放出来,即可实现C/S两端实时视频传输。

#客户端
import socket
import cv2
import threading
import struct
import numpy

class Camera_Connect_Object:
  def __init__(self,D_addr_port=["",8880]):
    self.resolution=[640,480]
    self.addr_port=D_addr_port
    self.src=888+15         #双方确定传输帧数,(888)为校验值
    self.interval=0         #图片播放时间间隔
    self.img_fps=15         #每秒传输多少帧数

  def Set_socket(self):
    self.client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    self.client.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

  def Socket_Connect(self):
    self.Set_socket()
    self.client.connect(self.addr_port)
    print("IP is %s:%d" % (self.addr_port[0],self.addr_port[1]))

  def RT_Image(self):
    #按照格式打包发送帧数和分辨率
    self.name=self.addr_port[0]+" Camera"
    self.client.send(struct.pack("lhh", self.src, self.resolution[0], self.resolution[1]))
    while(1):
      info=struct.unpack("lhh",self.client.recv(8))
      buf_size=info[0]          #获取读的图片总长度
      if buf_size:
        try:
          self.buf=b""        #代表bytes类型
          temp_buf=self.buf
          while(buf_size):      #读取每一张图片的长度
            temp_buf=self.client.recv(buf_size)
            buf_size-=len(temp_buf)
            self.buf+=temp_buf   #获取图片
            data = numpy.fromstring(self.buf, dtype='uint8')  #按uint8转换为图像矩阵
            self.image = cv2.imdecode(data, 1)         #图像解码
            cv2.imshow(self.name, self.image)          #展示图片
        except:
          pass;
        finally:
          if(cv2.waitKey(10)==27):    #每10ms刷新一次图片,按‘ESC'(27)退出
            self.client.close()
            cv2.destroyAllWindows()
            break

  def Get_Data(self,interval):
    showThread=threading.Thread(target=self.RT_Image)
    showThread.start()

if __name__ == '__main__':
  camera=Camera_Connect_Object()
  camera.addr_port[0]="服务端的ip"
  camera.addr_port=tuple(camera.addr_port)
  camera.Socket_Connect()
  camera.Get_Data(camera.interval

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python脚本暴力破解栅栏密码
Oct 19 Python
Python 的描述符 descriptor详解
Feb 27 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
Mar 24 Python
python使用Matplotlib画饼图
Sep 25 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
Oct 31 Python
pandas 层次化索引的实现方法
Jul 06 Python
python下载库的步骤方法
Oct 12 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
Pytorch环境搭建与基本语法
Jun 03 Python
Python字典fromkeys()方法使用代码实例
Jul 20 Python
详解python的super()的作用和原理
Oct 29 Python
pandas中对文本类型数据的处理小结
Nov 01 Python
python实现同一局域网下传输图片
Mar 20 #Python
python实现udp传输图片功能
Mar 20 #Python
python实现UDP协议下的文件传输
Mar 20 #Python
python实现TCP文件传输
Mar 20 #Python
python实现FTP循环上传文件
Mar 20 #Python
python实现ftp文件传输功能
Mar 20 #Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
Mar 20 #Python
You might like
人大复印资料处理程序_查询篇
2006/10/09 PHP
浅析php创建者模式
2014/11/25 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
PHP接口类(interface)的定义、特点和应用示例
2020/05/18 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
layui的table中显示图片方法
2018/08/17 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现dict版图遍历示例
2014/02/19 Python
Python实现list反转实例汇总
2014/11/11 Python
Numpy数组的保存与读取方法
2018/04/04 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
企划专员岗位职责
2013/12/09 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
产品质量保证书范本
2015/02/27 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书