忘關烤箱了?我用 Python 和 OpenCV 來幫忙

2020-12-04 FlyAI

這篇文章應用計算機視覺和圖像處理技術,展示了檢測烤箱開關狀態的過程。在生活中,有時你會粗心大意忘關烤箱之類的廚房電器,這潛在很大的危險。因此作者採用 Python 和 OpenCV,通過家庭攝像頭獲取的圖像來自動識別烤箱是否開著,進而可以觸發警報。

「我忘關烤箱了嗎?」

這個問題常常會在最不方便的時候出現在你的腦子裡。

有時是當你剛剛走出家門的時候。 有時是當你在上班路上的時候。 有時是當你坐在飛機上準備度個長假的時候……

解決這個問題的方法是多種多樣的:

橡皮筋的方法大聲說或唱出來(就像 Samuel L. Jackson 一樣)當你離開家去度假的時候,給烤箱在內的電器列個清單或做個標記。 或者,我們也許有更好的做法……

在本教程中,我們會嘗試利用技術手段解決這個問題。

Github 裡有完整代碼。

問題定義

對我們而言,我們需要確定一個信號,用於判斷烤箱的開關狀態。在我的廚房裡,這個信號就是頂部標記著「烤箱開」字樣的紅色燈。

當紅色燈亮的時候,烤箱是開著的:

當紅色燈滅的時候,烤箱是關著的:

預備條件

確保你的電腦上安裝了以下應用:

OpenCV 3.0Python 2.7Numpy 1.9

安裝 OpenCV3.0 和 Python 2.7

如果你尚未安裝 OpenCV,請按照 Adrian Rosebrock 的完美教程,在 OSX 系統上安裝 OpenCV 3.0 和 Python 2.7+。我在安裝步驟裡增加了一些自己的注釋,以防你在 OSX 上編譯 OpenCV 3.0時遇到問題。

步驟

如果你已經成功在你的環境中安裝了 OpenCV,我們就可以開始判斷烤箱開關的數據分析了。

加載需要的包

argparse —— 參數處理庫。numpy —— 高度優化的數值運算庫。OpenCV 在數組結構中使用 numpy。cv2 —— OpenCV 中圖像處理庫。

import argparseimport numpy as npimport cv2

載入圖片

image = cv2.imread(image_path)

圖片降噪

我們為了給圖片降噪,需要對輸入圖片進行平滑處理。這樣會更容易在圖片中定位目標。使用 medianBlur 函數,把光圈大小定為 3 。數字越大意味著圖像會越模糊。

blur_image = cv2.medianBlur(image, 3)

把圖片顏色轉為 HSV 格式

HSV —— 色度、飽和度和純度(亮度)。HSV 可以讓我們提取出一個彩色對象,因為它比 BGR 格式(譯者註:與我們常說的RBG色彩模型類似,三個字母分別代表紅藍綠三色)更容易表徵顏色。

把圖片轉為 HSV 格式可以讓我們通過色度(一個值而不是三個值),來確定圖片中的一個顏色。

以下是實現方式:

hsv_image = cv2.cvtColor(blur_image, cv2.COLOR_BGR2HSV)

執行結果如下圖:

檢測圖片中的顏色

為了檢測我們想要的顏色,我們可以查看烤箱燈圖片中顏色的直方圖。

我們可以看出,紅色在圖片中佔統治地位。紅色有兩個高峰 —— 一個幅度高,一個幅度低。這些顏色值轉變為色度範圍從 0 到10,以及從 160 到 180 (針對紅色)。

在 HSV 圖片中針對每一個色度範圍,我們可以創建一個遮罩,來去掉所有不在選定範圍的無關顏色。

def create_hue_mask(image, lower_color, upper_color):lower = np.array(lower_color, np.uint8) upper = np.array(upper_color, np.uint8) # Create a mask from the colors mask = cv2.inRange(image, lower, upper) output_image = cv2.bitwise_and(image, image, mask = mask) return output_image# Get lower red huelower_red_hue = create_hue_mask(hsv_image, [0, 100, 100], [10, 255, 255])# Get higher red huehigher_red_hue = create_hue_mask(hsv_image, [160, 100, 100], [179, 255,255])

結果如下:

接下來把這些圖片合併在一起,以抓取所有紅色色度。

full_image = cv2.addWeighted(lower_red_hue, 1.0, higher_red_hue, 1.0, 0.0)

結果如下:

發現圖片中的圓圈

現在我們的圖片上僅有紅色色度,接著我們需要判定紅燈是否開啟(即是否存在紅色色度的那個圓圈)。我們需要在新圖中發現圓圈,不過首先需要把圖片轉換成灰度圖(因為 HoughCircles 函數的輸入要求是灰度圖)。

檢測圖片中的圓圈需要以下參數(使用 OpenCV中 的 HoughCircles 函數):

灰度圖輸入。HOUGH_GRADIENT 是用來檢測圓圈的方法(目前僅有的一個方法)。累加器和圖片解析度的反比。在本例中,為1.2。待檢測圓圈圓心的最小距離,本例中為100。

#Convert image to grayscaleimage_gray = cv2.cvtColor(full_image, cv2.COLOR_BGR2GRAY)#Find circles in the imagecircles = cv2.HoughCircles(image_gray, cv2.HOUGH_GRADIENT, 1.2, 100)

結果

此時就可以檢查是否有圓圈了。如果有就意味著至少有一個烤箱燈亮著。如果找不到圓圈就意味著沒有燈亮,烤箱關著。

為了證明此結論,我們可以用下述代碼在原圖中畫圓圈:

# Draw the circles on the original imagecircles = np.round(circles[0, :]).astype("int")for (center_x, center_y, radius) in circles:cv2.circle(image, (center_x, center_y), radius, (0, 255, 0), 4)

結果如下:

下一步

接下來還有很多可以做的,比如:

檢測特定燈的開啟,用以了解烤箱的真實狀態。建立一個服務以便遠程檢查烤箱狀態。把該功能加入樹莓派(譯者註:基於Linux的迷你開發板),我們就擁有可以警告烤箱關閉與否的小型設備。

全部樣例代碼可以在 Github 中找到。

Github連結:https://github.com/kazuar/opencv_light_detection

End

相關焦點

  • 如何快速簡單的安裝opencv-python
    python3.6.8下載將pip源更換到國內鏡像用pip管理工具安裝庫文件時,默認使用國外的源文件,因此在國內的下載速度會比較慢,可能只有50KB/s。這樣就會從清華鏡像安裝opencv-contrib-python庫。
  • 使用OpenCV和Python構建自己的車輛檢測模型
    介紹我喜歡智慧城市的理念。自動智能能源系統、電網、一鍵接入埠的想法等等。這是一個令人著迷的概念!老實說,這是一個數據科學家的夢想,我很高興世界上很多城市都在朝著更智能的方向發展。智能城市的核心組成部分之一是自動交通管理。這不禁讓我思考——我能用我的數據科學知識來建立一個車輛檢測模型,在智能交通管理中發揮作用嗎?
  • 「python opencv視覺零基礎」十四、直方圖反向投影
    前文提醒:博主正在參加博客之星評比,成功入選Top200,現在暫居第九歡迎各位點擊了解更多幫我投票,非常感謝~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「python opencv視覺零基礎」十、圖片效果毛玻璃
    一、學習目標了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • opencv-python獲取圖像:面向對象與面向過程
    關於圖片的來源:1973年6月,美國南加州大學的信號圖像處理研究所的一個助理教授和他的一個研究生打算為了一個學術會議找一張數字照片,而他們對於手頭現有成堆"無聊"照片感到厭煩。事實上他們需要的是一個人臉照片,同時又能讓人眼前一亮。這時正好有人走進實驗室,手上帶著一本當時的花花公子雜誌,結果故事發生了……而限於當時實驗室設備和測試圖片的需要,lenna的圖片只摳到了原圖的肩膀部分。
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • OpenCV中的快速直線檢測
    本文範例運行環境FastLineDetectors運行必要條件FastLineDetectors屬於opencv-contrib中的模塊,需要安裝opencv-contrib-python。在python的opencv相關的安裝包中,opencv-python 包含主要模塊,opencv-contrib-python 包含主要模塊以及一些擴展模塊。但這兩個模塊並不兼容,如果已經安裝過opencv-python,需要先卸載,再安裝opencv-contrib-python。
  • 基於TensorFlow 、OpenCV 和 Docker 的實時視頻目標檢測
    翻譯 | 於志鵬  徐普     校對 | 陶玉龍     整理 | 孔令雙在本文中,我將介紹如何在 Docker 容器中使用 Tensorflow Object-detection API 來執行實時(網絡攝像頭)和視頻的目標檢測。
  • 基於OpenCv 和 Python 的手指識別及追蹤
    使用閾值處理和濾波技術來進行背景消除以獲得最佳結果。我在手指識別時遇到的挑戰之一是將手與背景區分開並識別手指的尖端。我將向您展示我用於手指跟蹤的技術,我在此項目中使用了該技術。如果想要查看手指識別和跟蹤的實際操作,請觀看我上傳的視頻。
  • 資料| Practical Python and OpenCV 一周時間帶你入門CV
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上,使用起來十分方便,把它與PyQt結合起來,就可以順利的操作視頻、圖像了。具體安裝請自行百度,這裡介紹使用方法。
  • 基於opencv 的圖像處理入門教程
    /代碼和樣例圖片的地址:https://github.com/ccc013/CodesNotes/tree/master/opencv_noteshttps://github.com/ccc013/CodesNotes/blob/master/opencv_notes/opencv_image_process_tutorial.ipynb
  • 用Python做特效,分分鐘碾壓五毛黨
    moviepypaddlehub都可以直接用pip安裝:pip install pillowpip install opencv-pythonpip install moviepy用paddlehub摳圖。
  • 人生苦短,我用Python,那麼問題來了,普通人要學python嗎?
    最近在教育店集中地兒瞎晃悠,震驚的發現這年頭六歲娃兒都要學編程了,當時我的表情是這樣的。回到家抱著冷嘲熱諷的心,我特意百度搜索了下新聞,結果我的表情是這樣的:1、Python將納入浙江省高考!從 2018 年起浙江省信息技術教材程式語言將會更換為 Python。
  • 基於python+OpenCV模塊的人臉識別定位技術
    什麼是OpenCV模塊OpenCV是一款跨平臺的視覺庫,可以支持的作業系統有Linux、Windows和Mac OS作業系統,並且還提供了多種語言的接口,比如Python,java,MATLAB等常用語言。
  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    在本篇文章中,除了那些我看電視節目和玩遊戲的時間,我敘述了在過去六個月的幾乎所有空閒時間裡所做的探索。現今,「機器學習」發展迅速,並有大量相關的文章,包括那些 Medium 上的博客,同時幾乎每位開發人員都開始在工作任務和本地項目中使用機器學習,但是從何處開始以及使用什麼方法總是令人困惑的。
  • Python第三方庫安裝
    pypi.org其中PyPI: Python Package Index是由PSF維護的展示全球Python計算生態的主站如要安裝圖像處理opencv-python庫可以搜索 opencv,但結果如下: