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图像常规操作
Nov 11 Python
详解Python发送email的三种方式
Oct 18 Python
Python解析Excle文件中的数据方法
Oct 23 Python
详解Python用户登录接口的方法
Apr 17 Python
Python QQBot库的QQ聊天机器人
Jun 19 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
python cookie反爬处理的实现
Nov 01 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
Nov 12 Python
基于Python实现粒子滤波效果
Dec 01 Python
python中的列表和元组区别分析
Dec 30 Python
Python入门基础之数字字符串与列表
Feb 01 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中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
javascript 常用关键字列表集合
2007/12/04 Javascript
用JS控制回车事件的代码
2011/02/20 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python爬虫爬取某站上海租房图片
2018/02/04 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
Python enumerate内置库用法解析
2020/02/24 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
蔬菜基地的创业计划书
2014/01/06 职场文书
司法局2014法制宣传日活动总结
2014/11/01 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
表扬通报怎么写
2015/01/16 职场文书
银行催款通知书
2015/04/17 职场文书
结婚十年感言
2015/07/31 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
解析Java中的static关键字
2021/06/14 Java/Android
Go语言编译原理之变量捕获
2022/08/05 Golang