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 相关文章推荐
教你用python3根据关键词爬取百度百科的内容
Aug 18 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
python抓取文件夹的所有文件
Feb 27 Python
Python中调用其他程序的方式详解
Aug 06 Python
python实现把二维列表变为一维列表的方法分析
Oct 08 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
Python with标签使用方法解析
Jan 17 Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 Python
python用opencv 图像傅里叶变换
Jan 04 Python
python画条形图的具体代码
Apr 20 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 04 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
YII实现分页的方法
2014/07/09 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
php实现的xml操作类
2016/01/15 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
vue的滚动条插件实现代码
2019/09/07 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
基于javascript的无缝滚动动画实现2
2020/08/07 Javascript
selenium处理元素定位点击无效问题
2019/06/12 Python
python requests证书问题解决
2019/09/05 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
预备党员思想汇报范文
2014/01/11 职场文书
文科毕业生自荐书范文
2014/04/17 职场文书
住宅质量保证书
2014/04/29 职场文书
护士感人事迹
2014/05/01 职场文书
高考励志标语
2014/06/05 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
预备党员介绍人意见
2015/06/01 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书