企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 安装OpenCV OpenCV是一个开源的跨平台(Linux、Window、Android和Mac OS系统)计算机视觉库。OpenCV有C函数和少量C++类构成,主要接口是C++,同时还提供Python,Java等接口,有常用的图像处理函数,能够快速的实现一些图像处理和识别任务。 在终端输入下面命令: ``` sudo apt-get install libopencv-dev sudo apt-get install python-opencv ``` ## 安装PIL PIL(python image library)是十分好用的一个可用于python的图像处理库,后面要用到它进行图像的压缩。 ``` sudo apt-get install python-imaging ``` ## 安装numpy ``` sudo apt-get install python-numpy ``` dst_camera.py ```python # -*- coding: UTF-8 -*- # dst_camera.py import cv2 import socket import time import Image import StringIO import numpy as np HOST, PORT = "192.168.0.109", 48626 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST, PORT)) #连接到服务器 f = sock.makefile() cv2.namedWindow("camera") while True: #从服务器读取数据,一行的结尾是‘\n’,在数据源端发送的每一帧数据的‘\n’替换成‘\-n’ msg = f.readline() if not msg: break print len(msg), msg[-2] jpeg = msg.replace("\-n", "\n") #将‘\-n’替换成‘\n’ buf = StringIO.StringIO(jpeg[0:-1]) #缓存数据 buf.seek(0) pi = Image.open(buf) #使用PIL读取jpeg图像数据 img = cv2.cvtColor(np.asarray(pi), cv2.COLOR_RGB2BGR) #从PIL的图像转成opencv支持的图像 buf.close() cv2.imshow("camera", img) #显示图像 if cv2.waitKey(10) == 27: break if cv2.waitKey(30) & 0xFF == ord('q'): #按q键退出while循环 break sock.close() cv2.destroyAllWindows() #关闭窗口 ``` 服务器端:server_camera.py ```python # -*- coding: UTF-8 -*- # server_camera.py import socket import time HOST, PORT = '', 48626 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind((HOST, PORT)) #绑定服务器的IP地址和端口号(端口号1024以上) sock.listen(2) #监听端口,等待客户端连接 print "Server is running on port %d; press Ctrl+C to terminate." % PORT #等待数据源端连接 src, src_addr = sock.accept() #接收客户端的连接请求 print "Source Connected by", src_addr #等待目标端连接 dst, dst_addr = sock.accept() #接收客户端的连接请求 print "Destination Connected by", dst_addr while True: msg = src.recv(1024*1024) if not msg: break try: dst.sendall(msg) except Exception as ex: dst, dst_addr = sock.accept() print "Destination Connected Again by", dst_addr except KeyboardInterrupt: print "Interrupted" break src.close() dst.close() sock.close() ``` > HOST = ''主机的IP地址设为空,使服务器可以接收来自任何客户端的连接 > PORT = 48626 #设置端口,选择一个任意大于1024的端口即可 数据源端:src_camera.py ```python # -*- coding: UTF-8 -*- # src_camera.py import cv2 import time import socket import Image import StringIO #获取摄像头 cap = cv2.VideoCapture(0) #调整采集图像大小为640*480 cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 480) HOST, PORT = '192.168.0.109', 46826 #连接服务器 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST, PORT)) while True: ret, img = cap.read() #获取一帧图像 if ret is False: #未获取图像时,退出循环 print("can not get this frame") continue pi = Image.fromarry(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) #将OpenCV下的图像转换成PIL支持的格式 buf = StringIO.StringIO() #缓存对象 pi.save(buf, format = 'JPEG') #将PIL下的图像压缩成jpeg格式,存入内存中的字符串 jpeg = buf.getvalue() #从buf中读出jpeg格式的图像 buf.close() transfer = jpeg.replace('\n', '\-n') #替换\n为\-n,因为后面传输时,终止的地方会加上\n,可以便于区分 print(len(transfer)) print(transfer[-1]) sock.sendall(transfer + "\n") #通过socket传到服务器 ''' cap.release() #释放摄像头 cv2.destroyAllWindows() #关闭所有窗口 ''' sock.close() #关闭socket ``` > PIL——图像处理库 > PIL库提供通用的图像处理功能,以及基本图像操作,如图像缩放、裁剪、旋转、颜色转换等。可以从http://www.pythonware.com/products/pil/下载 > PIL中最重要的模块为Image > fromarry()实现不同图像格式的转换 > 对于彩色图像,不管其格式是PNG,BMP还是JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。对于灰度图像,不管格式是PNG、BMP还是JPG,打开后,其模式是“L”。 > 对PNG、BMP和JPG格式的转换都是通过Image模块的open()和save()函数来完成。具体: > 要读取一幅图像, > ```python > from PIL import Image > pil_img = Image.open('example.jpg') > ``` > 在open()时,PIL会将他们解码成三通道的“RGB”图像(或“L”图像)。用户可以基于这个图像,对其进行处理 > 处理完毕,使用函数save(),可以将处理结果保存成PNG、BMP或JPG格式。 >https://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor > save()将图像保存到内存中的字符串。(在引入io模块前的旧python 2版本中,将使用StringIO模块,对于Python3,需要使用BytesIO) > ```python > from io import BytesIO > from PIL import Image > > image = Image.new("RGB", (300, 50)) > draw = ImageDraw.Draw(image) > draw.text((0, 0), "This text is drawn on image") > > buf = BytesIO() > image.save(buf, 'JPEG') #这里可以‘JPEG’、'PNG'或其他格式 > ``` > save()采用类似文件的对象和路径,因此可以像StringIO一样使用内存缓冲区。 > ```python > contents = buf.getvalue() > buf.close() > ``` > 具体的函数信息可以参考:http://effbot.org/imagingbook/image.htm >ret, frame = cap.read() >第一个参数ret为True或者False,代表有没有读取到图片 >第二个参数frame表示截取到一帧的图片 ## 运行结果 先运行服务器端的程序,输入 ``` python server_camera.py ``` 再运行数据源端的程序,输入 ``` python src_camera.py ``` 最后在客户端上运行,输入 ``` python dst_camera.py ``` 参考:https://blog.csdn.net/hongbin_xu/article/details/78948162