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调用新浪微博API项目实践
Jul 28 Python
Django实现图片文字同时提交的方法
May 26 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
python正则表达式的使用
Jun 12 Python
Java分治归并排序算法实例详解
Dec 12 Python
Python爬虫之正则表达式基本用法实例分析
Aug 08 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
Django实现学生管理系统
Feb 26 Python
Flask框架单例模式实现方法详解
Jul 31 Python
python中树与树的表示知识点总结
Sep 14 Python
flask 实现token机制的示例代码
Nov 07 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 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
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
php发送post请求的三种方法
2014/02/11 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
Python中subprocess的简单使用示例
2015/07/28 Python
python opencv之分水岭算法示例
2018/02/24 Python
python实现数据写入excel表格
2018/03/25 Python
Django 路由控制的实现代码
2018/11/08 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
会计应聘求职信范文
2013/12/17 职场文书
公司离职证明范本
2014/01/13 职场文书
小学生自我评价范文
2014/01/25 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
中学生励志演讲稿
2014/04/26 职场文书
校园文明标语
2014/06/13 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
2015年计算机教师工作总结
2015/07/22 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
用Python提取PDF表格的方法
2021/04/11 Python