這篇文章應(yīng)用計算機視覺和圖像處理技術(shù)劣像,展示了檢測烤箱開關(guān)狀態(tài)的過程屋群。在生活中对竣,有時你會粗心大意忘關(guān)烤箱之類的廚房電器烦味,這潛在很大的危險谬俄。因此作者采用 Python 和 OpenCV,通過家庭攝像頭獲取的圖像來自動識別烤箱是否開著弃理,進而可以觸發(fā)警報溃论。
“我忘關(guān)烤箱了嗎?”
這個問題常常會在最不方便的時候出現(xiàn)在你的腦子里痘昌。
有時是當你剛剛走出家門的時候钥勋。 有時是當你在上班路上的時候。 有時是當你坐在飛機上準備度個長假的時候……
解決這個問題的方法是多種多樣的:
橡皮筋的方法
大聲說或唱出來(就像 Samuel L. Jackson 一樣)
當你離開家去度假的時候辆苔,給烤箱在內(nèi)的電器列個清單或做個標記算灸。 或者,我們也許有更好的做法……
在本教程中驻啤,我們會嘗試利用技術(shù)手段解決這個問題菲驴。
Github 里有完整代碼。
問題定義
對我們而言骑冗,我們需要確定一個信號赊瞬,用于判斷烤箱的開關(guān)狀態(tài)先煎。在我的廚房里,這個信號就是頂部標記著“烤箱開”字樣的紅色燈巧涧。
當紅色燈亮的時候薯蝎,烤箱是開著的:
當紅色燈滅的時候,烤箱是關(guān)著的:
預(yù)備條件
確保你的電腦上安裝了以下應(yīng)用:
OpenCV 3.0
Python 2.7
Numpy 1.9
安裝 OpenCV3.0 和 Python 2.7
如果你尚未安裝 OpenCV谤绳,請按照 Adrian Rosebrock 的完美教程占锯,在 OSX 系統(tǒng)上安裝 OpenCV 3.0 和 Python 2.7+。我在安裝步驟里增加了一些自己的注釋闷供,以防你在 OSX 上編譯 OpenCV 3.0時遇到問題烟央。
步驟
如果你已經(jīng)成功在你的環(huán)境中安裝了 OpenCV,我們就可以開始判斷烤箱開關(guān)的數(shù)據(jù)分析了歪脏。
加載需要的包
argparse —— 參數(shù)處理庫疑俭。
numpy —— 高度優(yōu)化的數(shù)值運算庫。OpenCV 在數(shù)組結(jié)構(gòu)中使用 numpy婿失。
cv2 —— OpenCV 中圖像處理庫钞艇。
import?argparse
import?numpy?as?np
import?cv2
載入圖片
image = cv2.imread(image_path)
圖片降噪
我們?yōu)榱私o圖片降噪,需要對輸入圖片進行平滑處理豪硅。這樣會更容易在圖片中定位目標哩照。使用 medianBlur 函數(shù),把光圈大小定為 3 懒浮。數(shù)字越大意味著圖像會越模糊飘弧。
blur_image = cv2.medianBlur(image, 3)
把圖片顏色轉(zhuǎn)為 HSV 格式
HSV —— 色度、飽和度和純度(亮度)砚著。HSV 可以讓我們提取出一個彩色對象次伶,因為它比 BGR 格式(譯者注:與我們常說的RBG色彩模型類似,三個字母分別代表紅藍綠三色)更容易表征顏色稽穆。
把圖片轉(zhuǎn)為 HSV 格式可以讓我們通過色度(一個值而不是三個值)冠王,來確定圖片中的一個顏色。
以下是實現(xiàn)方式:
hsv_image = cv2.cvtColor(blur_image, cv2.COLOR_BGR2HSV)
執(zhí)行結(jié)果如下圖:
檢測圖片中的顏色
為了檢測我們想要的顏色舌镶,我們可以查看烤箱燈圖片中顏色的直方圖柱彻。
我們可以看出餐胀,紅色在圖片中占統(tǒng)治地位。紅色有兩個高峰 —— 一個幅度高卖擅,一個幅度低。這些顏色值轉(zhuǎn)變?yōu)樯确秶鷱?0 到10,以及從 160 到 180 (針對紅色)。
在 HSV 圖片中針對每一個色度范圍琳猫,我們可以創(chuàng)建一個遮罩,來去掉所有不在選定范圍的無關(guān)顏色私痹。
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 hue
lower_red_hue = create_hue_mask(hsv_image, [0, 100, 100], [10, 255, 255])
# Get higher red hue
higher_red_hue = create_hue_mask(hsv_image, [160, 100, 100], [179, 255, 255])
結(jié)果如下:
接下來把這些圖片合并在一起紊遵,以抓取所有紅色色度暗膜。
full_image = cv2.addWeighted(lower_red_hue, 1.0, higher_red_hue, 1.0, 0.0)
結(jié)果如下:
發(fā)現(xiàn)圖片中的圓圈
現(xiàn)在我們的圖片上僅有紅色色度学搜,接著我們需要判定紅燈是否開啟(即是否存在紅色色度的那個圓圈)瑞佩。我們需要在新圖中發(fā)現(xiàn)圓圈炬丸,不過首先需要把圖片轉(zhuǎn)換成灰度圖(因為 HoughCircles 函數(shù)的輸入要求是灰度圖)。
檢測圖片中的圓圈需要以下參數(shù)(使用 OpenCV中 的 HoughCircles 函數(shù)):
灰度圖輸入焕阿。
HOUGH_GRADIENT 是用來檢測圓圈的方法(目前僅有的一個方法)捣鲸。
累加器和圖片分辨率的反比栽惶。在本例中外厂,為1.2代承。
待檢測圓圈圓心的最小距離,本例中為100墓律。
#Convert image to grayscale
image_gray = cv2.cvtColor(full_image, cv2.COLOR_BGR2GRAY)
#Find circles in the image
circles = cv2.HoughCircles(image_gray, cv2.HOUGH_GRADIENT, 1.2, 100)
結(jié)果
此時就可以檢查是否有圓圈了耻讽。如果有就意味著至少有一個烤箱燈亮著帕棉。如果找不到圓圈就意味著沒有燈亮香伴,烤箱關(guān)著具帮。
為了證明此結(jié)論,我們可以用下述代碼在原圖中畫圓圈:
# Draw the circles on the original image
circles = 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)
結(jié)果如下:
下一步
接下來還有很多可以做的巴比,比如:
檢測特定燈的開啟轻绞,用以了解烤箱的真實狀態(tài)政勃。
建立一個服務(wù)以便遠程檢查烤箱狀態(tài)奸远。
把該功能加入樹莓派(譯者注:基于Linux的迷你開發(fā)板)丸冕,我們就擁有可以警告烤箱關(guān)閉與否的小型設(shè)備胖烛。
全部樣例代碼可以在學習群內(nèi)獲扰宸趟畏!
Python學習群:593088321