1. 程式人生 > >用樹莓派 + Python + OpenCV 實現家庭監控和移動目標探測(下)

用樹莓派 + Python + OpenCV 實現家庭監控和移動目標探測(下)

哇,上週那篇關於做一個基本運動檢測系統的文章真是贊。寫這篇文章很有樂趣,而且從像您一樣的讀者那裡獲得反饋,使我的努力變得很值得。

對於那些剛看到這篇文章的朋友,上週那篇文章是關於使用計算機視覺來建立一個運動檢測系統,其動機是因為我的朋友James,他罪惡的雙手伸進了我的冰箱,偷走了我最後一罐令人垂涎的啤酒。因為我不能證明是他乾的,所以我想看看我是不是能夠利用計算機視覺和樹莓派,當他再次嘗試偷走我的啤酒的時候當場抓獲他。

您將在本文的最後看到,我們要建造的家用監控和運動檢測系統不僅炫酷又簡約,而且針對我們這個特定的目標還非常的強大。

今天我們將要擴充套件我們的基礎運動檢測方法,並且:

  1. 讓我們的運動檢測系統變得健壯一些,這樣它就可以連續工作一整天,不那麼容易受光線變化所影響。
  2. 更新我們的程式碼,讓我們的家用監控系統可以在樹莓派上執行。
  3. 整合 Dropbox API,使得 Python 指令碼可以自動把安保圖片上傳到我們的 Dropbox 賬戶中。在本文中,我們會看到很多程式碼,請做好準備。但是我們也會學到很多東西。更重要的是,在本文的最後,你將擁有一個你自己的,可以執行的樹莓派家用監控系統。

你可以在下面找到全部的示例視訊以及一些其他的例子。

OpenCV and Python 版本 為了執行這個例子,你需要 Python 2.7 和 OpenCV 2.4.X.

在開始前,你需要:

動起來,讓我們把必要的東西都搞定。我會假設你已經有了一個樹莓派和 camera board(攝像頭模組)

最後,如果你想要上傳你的家庭安保圖片到個人 Dropbo x賬戶中,你需要到 Dropbox Core API 註冊並獲取你的公有和私有API keys,但接入Dropbox API 並不是本教程所必需的,只是一個錦上添花的東西。

除此之外,我們需要用pip-install安裝一個額外的包。

如果你沒有安裝我的 imutils 包,你需要從 GitHub 獲取或者通過 pip install imutils 安裝

並且如果你有興趣讓你的家用監控系統上傳安保圖片到 Dropbox,你需要 dropbox

 包:pip install dropbox

至此所有的東西都已經安裝並且正確配置,我們可以繼續前進使用 Python 和 OpenCV 來打造我們的家用監控及運動檢測系統了。

這裡是我們的安裝過程:

我在上篇文章提到過,我們家用監控系統的目標是抓住任何嘗試溜進我的冰箱並且偷走我的啤酒的人。

為了實現這一目標,我在我的櫥櫃上安裝了樹莓派+攝像頭:

圖1:在櫥櫃頂部安裝的樹莓派

這個系統會俯視冰箱和我公寓的正門:

圖2:樹莓派對準我的冰箱。如果有人嘗試偷啤酒的話,運動檢測程式碼就會被觸發,上傳圖片到我的Dropbox中。

如果有人嘗試開啟冰箱門並取走我的一罐啤酒,運動檢測程式碼會生效,上傳當前幀的截圖到Dropbox,可以抓他個人贓並獲。

DIY:使用樹莓派 + Python + OpenCV 打造家用監控及運動檢測系統

好啦,讓我們開始建造我們的樹莓派家用監控系統吧。首先讓我們看一下這個工程的目錄結構:

Python
12345|---pi_surveillance.py|---conf.json|---pyimagesearch||---__init__.py||---tempimage.py

我們家用監控系統的主要程式碼和邏輯會存放在 pi_surveillance.py 中。我們使用一個JSON配置檔案conf.json 來代替使用命令列引數或是在pi_surveillance.py中對引數進行硬編碼。

針對這樣一個工程,我發現放棄使用命令列引數並依賴一個JSON配置檔案是很有用的。有時候你有太多的命令列引數,這時利用一個JSON檔案會使其變得容易和更加整潔。

最後,為了更好的組織,我們會定義一個pyimagesearch 包,裡面包含一個單一的類TempImage,我們會在上傳到Dropbox之前使用它臨時將圖片寫入硬碟。

記住我們專案的目錄結構,開啟一個新的檔案,命名為pi_surveillance.py,並且開始匯入如下的包:

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 # 匯入必須的包 frompyimagesearch.tempimage importTempImage fromdropbox.client importDropboxOAuth2FlowNoRedirect fromdropbox.client importDropboxClient frompicamera.arrayimportPiRGBArray frompicamera importPiCamera importargparse importwarnings importdatetime importimutils importjson importtime importcv2 # 構建 argument parser 並解析 引數 ap=argparse.ArgumentParser() ap.add_argument