## 安裝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使用
- 俄羅斯方塊實現原理
- 俄羅斯方塊代碼講解
- 手勢控制的樹莓派相冊
- 模塊介紹
- 爬取圖片
- 電子相冊
- 附錄
- 網址