OpenCV實現(xiàn)實時顏色檢測的示例
一、引言
今天我將介紹一個使用Python和OpenCV庫實現(xiàn)的實時顏色識別系統(tǒng)。這個系統(tǒng)能夠通過攝像頭捕捉視頻流,并在視頻中指定區(qū)域內(nèi)識別主要顏色(紅、黃、綠、藍)。這種技術(shù)在機器人視覺、自動化檢測和交互式應(yīng)用中有著廣泛的應(yīng)用前景。
二、系統(tǒng)概述
該系統(tǒng)主要包含以下幾個功能:
- 實時視頻捕捉
- 在視頻幀中劃定特定檢測區(qū)域
- 將檢測區(qū)域轉(zhuǎn)換為HSV色彩空間
- 分析區(qū)域內(nèi)的色調(diào)(H)值
- 根據(jù)H值范圍判斷顏色類型
- 實時顯示結(jié)果
三、代碼解析
1. 導(dǎo)入庫
import cv2
我們只需要導(dǎo)入OpenCV庫,它提供了強大的計算機視覺功能,包括圖像處理和視頻捕捉。
2. 顏色識別函數(shù)
def get_color(img): H = [] color_name = None img = cv2.resize(img,(640,400),) # 將彩色圖轉(zhuǎn)換為HSV HSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 畫矩形框 cv2.rectangle(img,(280,180),(360,260),(0,255,0),2) # 依次取出每行每列的H,S,V值放入容器中 for i in range(280,360): for j in range(180,260): H.append(HSV[j,i][0]) # 分別計算出H,S,V的最大最小 H_min = min(H);H_max = max(H) # 判斷顏色 if H_min >= 0 and H_max <= 10 or H_min >= 156 and H_max <= 180: color_name='red' elif H_min >= 26 and H_max <= 34 : color_name='yellow' elif H_min >= 35 and H_max <= 77 : color_name='green' elif H_min >= 100 and H_max <= 124 : color_name='blue' print(color_name) return img,color_name
函數(shù)功能詳解:
圖像預(yù)處理:
- 首先將輸入圖像調(diào)整為固定尺寸(640×400),確保處理一致性
色彩空間轉(zhuǎn)換:
- 將BGR格式轉(zhuǎn)換為HSV格式,HSV色彩空間更適合顏色識別
- H(色調(diào)):表示顏色類型
- S(飽和度):表示顏色的純度
- V(亮度):表示顏色的明暗程度
檢測區(qū)域標(biāo)記:
- 在圖像上繪制一個綠色矩形框(280,180)到(360,260),標(biāo)識檢測區(qū)域
數(shù)據(jù)采集:
- 遍歷檢測區(qū)域內(nèi)每個像素點,收集所有H值
顏色判斷:
- 計算區(qū)域內(nèi)H值的最小和最大值
- 根據(jù)H值范圍判斷顏色:
- 紅色:0-10或156-180
- 黃色:26-34
- 綠色:35-77
- 藍色:100-124
3. 主程序循環(huán)
cap = cv2.VideoCapture(0) while 1: _,frame=cap.read() img,cal = get_color(frame) cv2.imshow('',img) if cv2.waitKey(1) == 27: break
視頻捕捉初始化:
- 創(chuàng)建VideoCapture對象,參數(shù)0表示使用默認攝像頭
主循環(huán):
- 不斷讀取視頻幀
- 調(diào)用get_color函數(shù)處理每一幀
- 顯示處理后的圖像
- 按ESC鍵(ASCII 27)退出程序
四、HSV色彩空間詳解
為什么選擇HSV而不是RGB進行顏色識別?
RGB的局限性:
- RGB三個通道都與亮度相關(guān)
- 對光照變化敏感
- 顏色判斷需要同時考慮三個通道
HSV的優(yōu)勢:
- 將顏色信息(H)與亮度(V)、飽和度(S)分離
- 對光照變化有一定魯棒性
- 顏色判斷主要依據(jù)H通道
五、顏色范圍設(shè)定
OpenCV中HSV的范圍:
- H: 0-180 (通常色彩空間為0-360,但OpenCV使用8位存儲,所以除以2)
- S: 0-255
- V: 0-255
常見顏色H值范圍:
- 紅色:0-10和170-180
- 橙色:11-25
- 黃色:26-34
- 綠色:35-77
- 藍色:100-124
- 紫色:125-155
可對比如下的顏色范圍圖
六、系統(tǒng)優(yōu)化建議
增加飽和度(S)和亮度(V)的過濾:
- 可以排除低飽和度(接近灰色)或低亮度(接近黑色)的區(qū)域
使用均值而非極值:
- 當(dāng)前使用min/max容易受噪聲影響,可改為計算平均值
擴大檢測區(qū)域:
- 當(dāng)前區(qū)域較小(80×80像素),可以適當(dāng)擴大
添加更多顏色識別:
- 如橙色、紫色等
優(yōu)化性能:
- 當(dāng)前雙重循環(huán)效率不高,可以使用NumPy進行向量化操作
七、完整代碼
import cv2 def get_color(img): H = [] color_name = None img = cv2.resize(img,(640,400),) # 將彩色圖轉(zhuǎn)換為HSV HSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 畫矩形框 cv2.rectangle(img,(280,180),(360,260),(0,255,0),2) # 依次取出每行每列的H,S,V值放入容器中 for i in range(280,360): for j in range(180,260): H.append(HSV[j,i][0]) # 分別計算出H,S,V的最大最小 H_min = min(H);H_max = max(H) # 判斷顏色 if H_min >= 0 and H_max <= 10 or H_min >= 156 and H_max <= 180: color_name='red' elif H_min >= 26 and H_max <= 34 : color_name='yellow' elif H_min >= 35 and H_max <= 77 : color_name='green' elif H_min >= 100 and H_max <= 124 : color_name='blue' print(color_name) return img,color_name cap = cv2.VideoCapture(0) while 1: _,frame=cap.read() img,cal = get_color(frame) cv2.imshow('',img) if cv2.waitKey(1) == 27: break
八、總結(jié)
本文介紹了一個基于OpenCV的實時顏色識別系統(tǒng),通過HSV色彩空間轉(zhuǎn)換和色調(diào)范圍判斷實現(xiàn)了基本顏色識別功能。該系統(tǒng)可以作為更復(fù)雜計算機視覺項目的基礎(chǔ),通過進一步優(yōu)化和擴展,能夠滿足各種實際應(yīng)用需求。
到此這篇關(guān)于OpenCV實現(xiàn)實時顏色檢測的示例的文章就介紹到這了,更多相關(guān)OpenCV 實時顏色檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解c++中signal信號攜帶數(shù)據(jù)的接收與發(fā)送
這篇文章主要為大家詳細介紹了c++中signal信號攜帶數(shù)據(jù)的接收與發(fā)送的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01C語言 scanf輸入多個數(shù)字只能以逗號分隔的操作
這篇文章主要介紹了C語言 scanf輸入多個數(shù)字只能以逗號分隔的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12