python 利用opencv实现图像网络传输


Posted in Python onNovember 12, 2020

本代码主要实现的是利用网络传输图片,用在我的树莓派项目之上。该项目在PC上运行服务端,树莓派上运行客户端,两者连接到同一局域网中,修改代码中的IP地址,就可以实现将树莓派采集到的图像数据实时传输到PC端。先运行服务端代码,然后运行客户端代码即可。树莓派摄像头使用的是普通的USB摄像头,并且在树莓派上安装了opencv,在树莓派上安装opencv的过程可以参考https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/。最后,该代码稍加修改就可以传输其他的信息,当然服务端,客户端也可以同时在PC上运行,以验证结果。所以本质还是希望读者借此代码可以了解python的socket编程。代码意义已在注释中详细说明,仅供参考。使用时请注意修改IP地址和端口号。

服务端代码

import socket
import time
import cv2
import numpy
 
def ReceiveVideo():
	#IP地址'0.0.0.0'为等待客户端连接
	address = ('0.0.0.0', 8002)
	#建立socket对象,参数意义见https://blog.csdn.net/rebelqsp/article/details/22109925
	#socket.AF_INET:服务器之间网络通信 
	#socket.SOCK_STREAM:流式socket , for TCP
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	#将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址.
	s.bind(address)
	#开始监听TCP传入连接。参数指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
	s.listen(1)
 
	def recvall(sock, count):
		buf = b''#buf是一个byte类型
		while count:
			#接受TCP套接字的数据。数据以字符串形式返回,count指定要接收的最大数据量.
			newbuf = sock.recv(count)
			if not newbuf: return None
			buf += newbuf
			count -= len(newbuf)
		return buf
		
	#接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。addr是连接客户端的地址。
	#没有连接则等待有连接
	conn, addr = s.accept()
	print('connect from:'+str(addr))
	while 1:
		start = time.time()#用于计算帧率信息
		length = recvall(conn,16)#获得图片文件的长度,16代表获取长度
		stringData = recvall(conn, int(length))#根据获得的文件长度,获取图片文件
		data = numpy.frombuffer(stringData, numpy.uint8)#将获取到的字符流数据转换成1维数组
		decimg=cv2.imdecode(data,cv2.IMREAD_COLOR)#将数组解码成图像
		cv2.imshow('SERVER',decimg)#显示图像
		
		#进行下一步处理
		#。
		#。
		#。
 
    #将帧率信息回传,主要目的是测试可以双向通信
		end = time.time()
		seconds = end - start
		fps = 1/seconds;
		conn.send(bytes(str(int(fps)),encoding='utf-8'))
		k = cv2.waitKey(10)&0xff
		if k == 27:
			break
	s.close()
	cv2.destroyAllWindows()
 
if __name__ == '__main__':
	ReceiveVideo()

客户端代码:

import socket
import cv2
import numpy
import time
 
def SendVideo():
	#建立sock连接
	#address要连接的服务器IP地址和端口号
	address = ('127.0.0.1', 8002)
	try:
		#建立socket对象,参数意义见https://blog.csdn.net/rebelqsp/article/details/22109925
		#socket.AF_INET:服务器之间网络通信 
		#socket.SOCK_STREAM:流式socket , for TCP
		sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
		#开启连接
		sock.connect(address)
	except socket.error as msg:
		print(msg)
		sys.exit(1)
 
	#建立图像读取对象
	capture = cv2.VideoCapture(0)
	#读取一帧图像,读取成功:ret=1 frame=读取到的一帧图像;读取失败:ret=0
	ret, frame = capture.read()
	#压缩参数,后面cv2.imencode将会用到,对于jpeg来说,15代表图像质量,越高代表图像质量越好为 0-100,默认95
	encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),15]
 
	while ret:
		#停止0.1S 防止发送过快服务的处理不过来,如果服务端的处理很多,那么应该加大这个值
		time.sleep(0.01)
		#cv2.imencode将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输
		#'.jpg'表示将图片按照jpg格式编码。
		result, imgencode = cv2.imencode('.jpg', frame, encode_param)
		#建立矩阵
		data = numpy.array(imgencode)
		#将numpy矩阵转换成字符形式,以便在网络中传输
		stringData = data.tostring()
		
		#先发送要发送的数据的长度
		#ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串
		sock.send(str.encode(str(len(stringData)).ljust(16)));
		#发送数据
		sock.send(stringData);
		#读取服务器返回值
		receive = sock.recv(1024)
		if len(receive):print(str(receive,encoding='utf-8'))
		#读取下一帧图片
		ret, frame = capture.read()
		if cv2.waitKey(10) == 27:
			break
	sock.close()
	
if __name__ == '__main__':
	SendVideo()

以上就是python 利用opencv实现图像网络传输的详细内容,更多关于python 图像网络传输的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
编写Python脚本抓取网络小说来制作自己的阅读器
Aug 20 Python
Windows系统下多版本pip的共存问题详解
Oct 10 Python
Python实现返回数组中第i小元素的方法示例
Dec 04 Python
解决pandas中读取中文名称的csv文件报错的问题
Jul 04 Python
Sanic框架应用部署方法详解
Jul 18 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
Nov 30 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
pytorch 修改预训练model实例
Jan 18 Python
Tensorflow 卷积的梯度反向传播过程
Feb 10 Python
python中的yield from语法快速学习
Nov 06 Python
字典算法实现及操作 --python(实用)
Mar 31 Python
Anaconda详细安装步骤图文教程
Nov 12 #Python
Jupyter Notebook安装及使用方法解析
Nov 12 #Python
利用Python发送邮件或发带附件的邮件
Nov 12 #Python
Python如何使用ConfigParser读取配置文件
Nov 12 #Python
Python使用windows设置定时执行脚本
Nov 12 #Python
Django restful framework生成API文档过程详解
Nov 12 #Python
Python通过Schema实现数据验证方式
Nov 12 #Python
You might like
php中socket的用法详解
2014/10/24 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
FireFox JavaScript全局Event对象
2009/06/14 Javascript
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
jQuery文本框(input textare)事件绑定方法教程
2013/04/24 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
jQuery实现给页面换肤的方法
2015/05/30 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
jQuery 利用ztree实现树形表格的实例代码
2017/09/27 jQuery
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
js+html5 canvas实现ps钢笔抠图
2019/04/28 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
基于Python实现简单学生管理系统
2020/07/24 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
工作的心得体会
2013/12/31 职场文书
社区八一活动方案
2014/02/03 职场文书
党支部书记岗位职责
2015/02/15 职场文书