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 相关文章推荐
操作Windows注册表的简单的Python程序制作教程
Apr 07 Python
详解Python3中yield生成器的用法
Aug 20 Python
Python+django实现简单的文件上传
Aug 17 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
Django框架自定义session处理操作示例
May 27 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
python函数定义和调用过程详解
Feb 09 Python
学习Python爬虫的几点建议
Aug 05 Python
Python编写车票订购系统 Python实现快递收费系统
Aug 14 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
用Php实现链结人气统计
2006/10/09 PHP
通俗易懂的php防注入代码
2010/04/07 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
用Python实现命令行闹钟脚本实例
2016/09/05 Python
python更改已存在excel文件的方法
2018/05/03 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
python程序需要编译吗
2020/06/19 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
小程序canvas中文字设置居中锚点
2019/04/16 HTML / CSS
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
机械设计制造专业个人求职信
2013/09/25 职场文书
后备干部培训方案
2014/05/22 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书