硬件:樹莓派3B,攝像頭500W像素,4.5寸觸摸屏。(屏幕驅動以及攝像頭驅動商家提供)
入坑樹莓派挺久了,一直沒有記錄一些問題,今天有時間把問題總結記錄一下。
一.樹莓派更換源
由於樹莓派官方源在國外太卡太慢,所以我們把源更換為阿里源或者清華或者中科大的。
步驟1.確保樹莓派網絡連接上wifi或者寬帶
2.在命令行窗口內輸入 sudo vim /etc/apt/sources.list
並回車,進入編輯器。(如果沒有安裝vim建議用 sudo apt-get vim安裝)
3.接着編輯這個文件,如下圖所示,把原來的內容注釋掉(最前面加 # 號),在文件最頂部添加下面的內容:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
4.vim命令模式按wq退出並保存
5.同樣的方法,把 /etc/apt/sources.list.d/raspi.list
文件也替換成下面的內容:
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
5.然后樹莓派更新源下載源都改好了,后面下載安裝就會更快。
二.樹莓派安裝opencv和python以及一些必要的庫
a) 安裝:opencv
sudo apt-get install -y libopencv-dev python3-opencv
b) 安裝計算庫:numpy
sudo pip3 install numpy
c) 安裝幀傳輸模塊:zmq
sudo pip3 install zmq
d) 安裝幀的編碼和解碼的庫:
sudo pip3 install pybase64
e) 安裝picamera sudo pip3 install picamera
三.測試opencv庫以及python
# -*- coding: utf-8 -*-
__author__ = "kyoRan"
import cv2 cap = cv2.VideoCapture(0) # 打開攝像頭
print("VideoCapture is opened?", cap.isOpened()) while(True): ret, frame = cap.read() # 讀取攝像頭圖像
center = (frame.shape[1]//2, frame.shape[0]//2) # 圖像中心點位置
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 轉灰度
cv2.circle(frame, center=center, radius=100, color=(0,0,255)) # 畫圓
cv2.imshow("frame", frame) # 顯示圖片
if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() # 釋放攝像頭
cv2.destroyAllWindows() # 關閉所有窗口
四.實時監控代碼
樹莓派客戶端
#!/usr/bin/env python # -*- coding=utf-8 -*-
import cv2 import zmq import base64 import picamera from picamera.array import PiRGBArray IP = '192.168.31.84' #視頻接受端的IP地址
"""初始化攝像頭部分""" camera = picamera.PiCamera() camera.resolution = (640,480) camera.framerate = 20 rawCapture = PiRGBArray(camera, size = (640,480)) """實例化用來發送幀的zmq對象""" contest = zmq.Context() """zmq對象使用TCP通訊協議""" footage_socket = contest.socket(zmq.PAIR) """zmq對象和視頻接收端建立TCP通訊協議""" footage_socket.connect('tcp://%s:5555'%IP) print(IP) """循環從攝像頭采集圖像 由於使用的是樹莓派攝像頭,因此需要把use_video_port設置為True frame為采集到的圖像"""
for frame in camera.capture_continuous(rawCapture, format='bgr', use_video_port=True): frame_image = frame.array #把采集到的圖像進行轉換為numpy array
encoded, buffer = cv2.imencode('.jpg', frame_image) #把轉換后的圖像數據再次轉換成流數據,
# 並且把流數據儲存到內噸buffer中
jpg_as_test = base64.b64encode(buffer) #把內存中的圖像流數據進行base64編碼
footage_socket.send(jpg_as_test) #把編碼后的流數據發送給視頻的接收端
rawCapture.truncate(0) #釋放內存,准備進行下一幀的視頻圖像傳輸
電腦端代碼
import cv2 import zmq import base64 import numpy as np """實例化用來接收幀的zmq對象""" context = zmq.Context() """zmq對象建立TCP鏈接""" footage_socket = context.socket(zmq.PAIR) footage_socket.bind('tcp://*:5555') while True: print("listion") frame = footage_socket.recv_string() #接收TCP傳輸過來的一幀視頻圖像數據
img = base64.b64decode(frame) #把數據進行base64解碼后儲存到內存img變量中
npimg = np.frombuffer(img, dtype=np.uint8) #把這段緩存解碼成一維數組
source = cv2.imdecode(npimg, 1) #將一維數組解碼為圖像source
cv2.imshow("Stream", source) #把圖像顯示在窗口中
cv2.waitKey(1) #延時等待,防止出現窗口無響應
問題
a.ssh總是斷連或者連接不上
1.長時間連接如果電腦網絡切換,比如說原來我電腦開的熱點,后面我手機開的熱點或者后面用了寬帶,都有可能改變樹莓派或者主機的IP地址,需要改一下在連接
2.樹莓派的ssh服務沒有開啟,在樹莓派上啟用 SSH. SSH 在樹莓派上是默認關閉的,因此在你安裝好全新的 Raspbian 后打開樹莓派時,你需要啟用它。. 首先通過菜單進入樹莓派的配置界面。. 現在進入接口interfaces標簽,啟動 SSH 並重啟你的樹莓派。. 你也可以通過終端直接啟動 SSH。. 僅需輸入命令 sudo raspi-config 然后進入高級設置以啟用 SSH。.
3.防火牆打開了,最好關閉掉。
樹莓派安裝防火牆 sudo apt-get install ufw
防火牆狀態查看 sudo ufw status active是開啟 inactive是未開啟
防火牆開啟 sudo ufw enable
防火牆關閉 sudo ufw disable
開放端口號8090 sudo ufw allow 8090
b.樹莓派安裝包依賴問題的解決
當在樹莓派安裝軟件時,時常遇到因安裝包依賴問題導致無法成功安裝的問題,此時可以使用aptitude (Debian系統的包管理工具)。
與 apt-get 不同的是,aptitude 在處理依賴問題上更佳一些。舉例來說,aptitude 在刪除一個包時,會同時刪除本身所依賴的包。這樣,系統中不會殘留無用的包,整個系統更為干凈。
安裝指令:sudo apt-get install aptitude
語法:aptitude(選項)(參數)
注意,安裝了aptitude后,apt-get無法使用,有些安裝包的情況下aptitude安裝不了,這時候就很麻煩需要把aptitude卸載再找回apt-get,所以一般情況下還是用apt-get
c.在xshell中無法連接 Gtk-WARNING **: 15:12:08.891: cannot open display: localhost:10.0
,如下圖
解決辦法,使用VNC虛擬桌面或者直接接鍵盤鼠標到樹莓派