使用Python和OpenCV庫(kù)實(shí)現(xiàn)實(shí)時(shí)顏色識(shí)別系統(tǒng)
一、引言
今天我將介紹一個(gè)使用Python和OpenCV庫(kù)實(shí)現(xiàn)的實(shí)時(shí)顏色識(shí)別系統(tǒng)。這個(gè)系統(tǒng)能夠通過(guò)攝像頭捕捉視頻流,并在視頻中指定區(qū)域內(nèi)識(shí)別主要顏色(紅、黃、綠、藍(lán))。這種技術(shù)在機(jī)器人視覺(jué)、自動(dòng)化檢測(cè)和交互式應(yīng)用中有著廣泛的應(yīng)用前景。
二、系統(tǒng)概述
該系統(tǒng)主要包含以下幾個(gè)功能:
- 實(shí)時(shí)視頻捕捉
- 在視頻幀中劃定特定檢測(cè)區(qū)域
- 將檢測(cè)區(qū)域轉(zhuǎn)換為HSV色彩空間
- 分析區(qū)域內(nèi)的色調(diào)(H)值
- 根據(jù)H值范圍判斷顏色類型
- 實(shí)時(shí)顯示結(jié)果
三、代碼解析
1. 導(dǎo)入庫(kù)
import cv2
我們只需要導(dǎo)入OpenCV庫(kù),它提供了強(qiáng)大的計(jì)算機(jī)視覺(jué)功能,包括圖像處理和視頻捕捉。
2. 顏色識(shí)別函數(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])
# 分別計(jì)算出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色彩空間更適合顏色識(shí)別
- H(色調(diào)):表示顏色類型
- S(飽和度):表示顏色的純度
- V(亮度):表示顏色的明暗程度
檢測(cè)區(qū)域標(biāo)記:
- 在圖像上繪制一個(gè)綠色矩形框(280,180)到(360,260),標(biāo)識(shí)檢測(cè)區(qū)域
數(shù)據(jù)采集:
- 遍歷檢測(cè)區(qū)域內(nèi)每個(gè)像素點(diǎn),收集所有H值
顏色判斷:
- 計(jì)算區(qū)域內(nèi)H值的最小和最大值
- 根據(jù)H值范圍判斷顏色:
- 紅色:0-10或156-180
- 黃色:26-34
- 綠色:35-77
- 藍(lán)色: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對(duì)象,參數(shù)0表示使用默認(rèn)攝像頭
主循環(huán):
- 不斷讀取視頻幀
- 調(diào)用get_color函數(shù)處理每一幀
- 顯示處理后的圖像
- 按ESC鍵(ASCII 27)退出程序
四、HSV色彩空間詳解
為什么選擇HSV而不是RGB進(jìn)行顏色識(shí)別?
RGB的局限性:
- RGB三個(gè)通道都與亮度相關(guān)
- 對(duì)光照變化敏感
- 顏色判斷需要同時(shí)考慮三個(gè)通道
HSV的優(yōu)勢(shì):
- 將顏色信息(H)與亮度(V)、飽和度(S)分離
- 對(duì)光照變化有一定魯棒性
- 顏色判斷主要依據(jù)H通道
五、顏色范圍設(shè)定
OpenCV中HSV的范圍:
- H: 0-180 (通常色彩空間為0-360,但OpenCV使用8位存儲(chǔ),所以除以2)
- S: 0-255
- V: 0-255
常見(jiàn)顏色H值范圍:
- 紅色:0-10和170-180
- 橙色:11-25
- 黃色:26-34
- 綠色:35-77
- 藍(lán)色:100-124
- 紫色:125-155
可對(duì)比如下的顏色范圍圖

六、系統(tǒng)優(yōu)化建議
增加飽和度(S)和亮度(V)的過(guò)濾:
- 可以排除低飽和度(接近灰色)或低亮度(接近黑色)的區(qū)域
使用均值而非極值:
- 當(dāng)前使用min/max容易受噪聲影響,可改為計(jì)算平均值
擴(kuò)大檢測(cè)區(qū)域:
- 當(dāng)前區(qū)域較小(80×80像素),可以適當(dāng)擴(kuò)大
添加更多顏色識(shí)別:
- 如橙色、紫色等
優(yōu)化性能:
- 當(dāng)前雙重循環(huán)效率不高,可以使用NumPy進(jìn)行向量化操作
七、完整代碼
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])
# 分別計(jì)算出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é)
本文介紹了一個(gè)基于OpenCV的實(shí)時(shí)顏色識(shí)別系統(tǒng),通過(guò)HSV色彩空間轉(zhuǎn)換和色調(diào)范圍判斷實(shí)現(xiàn)了基本顏色識(shí)別功能。該系統(tǒng)可以作為更復(fù)雜計(jì)算機(jī)視覺(jué)項(xiàng)目的基礎(chǔ),通過(guò)進(jìn)一步優(yōu)化和擴(kuò)展,能夠滿足各種實(shí)際應(yīng)用需求。
以上就是使用Python和OpenCV庫(kù)實(shí)現(xiàn)實(shí)時(shí)顏色識(shí)別系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV實(shí)時(shí)顏色識(shí)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python爬蟲系列網(wǎng)絡(luò)請(qǐng)求案例詳解
這篇文章主要介紹了【Python從零到壹】python爬蟲系列-網(wǎng)絡(luò)請(qǐng)求,從零開(kāi)始學(xué)習(xí)Python網(wǎng)絡(luò)爬蟲,如何從中獲取需要的數(shù)據(jù)信息,現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí)2021-04-04
python將圖片透明背景轉(zhuǎn)為白色背景的兩種方法
這篇文章主要為大家詳細(xì)介紹了python如何使用opencv2和PIL實(shí)現(xiàn)將圖片透明背景轉(zhuǎn)換成白色背景功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-05-05
Python實(shí)現(xiàn)多張圖片合成文字的效果
前段時(shí)間看到有人問(wèn)如何使用Python實(shí)現(xiàn)多張圖片組成文字的效果?覺(jué)得還挺有意思,于是嘗試做了一下,剛好趕上端午節(jié),所以打算從網(wǎng)上下載1000張王心凌的照片,組成端午安康的字樣,感興趣的可以了解一下2022-06-06
詳解python常用命令行選項(xiàng)與環(huán)境變量
這篇文章主要介紹了python常用命令行選項(xiàng)與環(huán)境變量,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Python可視化學(xué)習(xí)之seaborn繪制矩陣圖詳解
矩陣圖即用一張圖繪制多個(gè)變量之間的關(guān)系,數(shù)據(jù)挖掘中常用于初期數(shù)據(jù)探索。本文介紹python中seaborn.pairplot和seaborn.PairGrid繪制矩陣圖,需要的可以參考一下2022-02-02
詳細(xì)分析Python collections工具庫(kù)
這篇文章主要介紹了詳解Python collections工具庫(kù)的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
對(duì)Python中GIL(全局解釋器鎖)的一點(diǎn)理解淺析
首先需要明確的一點(diǎn)是GIL并不是Python的特性,它是在實(shí)現(xiàn)Python解析器(CPython)時(shí)所引入的一個(gè)概念,下面這篇文章主要給大家介紹了關(guān)于對(duì)Python中GIL的一點(diǎn)理解,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
Python使用pathlib庫(kù)實(shí)現(xiàn)優(yōu)雅的處理路徑
如果你需要在 Python 里進(jìn)行文件處理,那么標(biāo)準(zhǔn)庫(kù)中的os和os.path兄弟倆一定是你無(wú)法避開(kāi)的兩個(gè)模塊,本文主要來(lái)和大家聊聊如何使用pathlib庫(kù)實(shí)現(xiàn)優(yōu)雅的處理路徑,感興趣的可以了解下2023-12-12
django 開(kāi)發(fā)忘記密碼通過(guò)郵箱找回功能示例
這篇文章主要介紹了django 開(kāi)發(fā)忘記密碼通過(guò)郵箱找回功能示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04

