## 安装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
- 前言
- 第一章 树莓派快速入门
- 1. 初识树莓派3B+
- 2. 烧录系统
- 3. 树莓派连接键盘鼠标和显示器
- 4. 启动树莓派
- 5.树莓派连接网络
- 6. Windows远程访问树莓派
- 7. 终端通过raspi-config配置树莓派
- 第二章 树莓派编程
- 1. Linux入门操作
- 常用的linux命令
- 重要的快捷键
- 通过命令安装软件
- 树莓派关机/重启
- 2. 创建、编辑和保存文件
- 3. 创建并运行Python程序
- 4. 使用树莓派的GPIO口
- 第三章 树莓派套件应用
- 树莓派3B+ IO扩展板介绍
- 家居系统
- 会呼吸的RGB灯
- 树莓派控制家电
- 制作一个环境检测仪
- 树莓派摄像头做远程监控
- 摄像头使用
- socket通信
- PiCamera + socket远程监控
- AI语音
- 配置snowboy
- 自定义响应
- 采集语音和语音播放
- 语音机器人
- 图灵机器人
- 俄罗斯方块小游戏
- pygame基本使用
- ADKeyboard使用
- 俄罗斯方块实现原理
- 俄罗斯方块代码讲解
- 手势控制的树莓派相册
- 模块介绍
- 爬取图片
- 电子相册
- 附录
- 网址