使用 OPENCV Python 進(jìn)行顏色檢測和選擇

在今天的文章中,我們將討論如何使用 OpenCV-python 從圖像或視頻內(nèi)容中檢測和選擇顏色。
在開始之前,想指出你需要與本文一起完成的先決條件。首先,考慮到你已經(jīng)了解編程,你需要知道如何在 OpenCV-python 中讀取和顯示圖像。
讀取和顯示圖像
這里的第一步是使用 opencv 從圖像文件中讀取和顯示圖像。為此,我們將使用下面的代碼片段:
import cv2
# read the image into memory
img = cv2.imread("./images/image1.jpg")
# resise the image
img = cv2.resize(img, (640, 480))
# create a window named image and display the image inside of it.
cv2.imshow("Image", img)
# wait untill a any key is pressed to quite the program
cv2.waitKey(0)
創(chuàng)建 Trackbar 滑動條
為了檢測圖像中的顏色,我們需要將圖像轉(zhuǎn)換為 HSV(Hue Saturation Value)圖像。此圖像比例將允許用于在給定的 UPPER 和 LOWER 范圍內(nèi)選擇顏色。
在本節(jié)中,讓我們繼續(xù)編寫代碼來創(chuàng)建滑動條,并從滑塊中提取值作為用戶輸入。
為此,我們的代碼需要進(jìn)行更多更改。它現(xiàn)在應(yīng)該是這樣的。
import cv2
import numpy as np
def do_nothing():
pass
# create slider here
cv2.namedWindow("Slider")
cv2.resizeWindow("Slider", 640, 480)
cv2.createTrackbar("Hue Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Hue Max", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Saturation Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Saturation Max", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Value Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Value Max", "Slider", 0, 255, do_nothing)
img = cv2.imread("./images/image1.jpg")
img = cv2.resize(img, (640, 480))
while True:
# extract the values from the trackbar
hue_min = cv2.getTrackbarPos("Hue Min", "Slider")
hue_max = cv2.getTrackbarPos("Hue Max", "Slider")
sat_min = cv2.getTrackbarPos("Saturation Min", "Slider")
sat_max = cv2.getTrackbarPos("Saturation Max", "Slider")
val_min = cv2.getTrackbarPos("Value Min", "Slider")
val_max = cv2.getTrackbarPos("Value Max", "Slider")
print(hue_min, hue_max, sat_min, sat_max, val_min, val_max)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
將圖像轉(zhuǎn)換為 HSV 比例
現(xiàn)在我們能夠讓滑塊和滑動條正常工作,讓我們繼續(xù)將我們的圖像轉(zhuǎn)換為 HSV 比例,然后能夠在特定顏色范圍內(nèi)選擇顏色。
我們可以用第35行的代碼做到這一點(diǎn)
import cv2
import numpy as np
def do_nothing():
pass
# create slider here
cv2.namedWindow("Slider")
cv2.resizeWindow("Slider", 640, 480)
cv2.createTrackbar("Hue Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Hue Max", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Saturation Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Saturation Max", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Value Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Value Max", "Slider", 0, 255, do_nothing)
img = cv2.imread("./images/image1.jpg")
img = cv2.resize(img, (640, 480))
while True:
# extract the values from the trackbar
hue_min = cv2.getTrackbarPos("Hue Min", "Slider")
hue_max = cv2.getTrackbarPos("Hue Max", "Slider")
sat_min = cv2.getTrackbarPos("Saturation Min", "Slider")
sat_max = cv2.getTrackbarPos("Saturation Max", "Slider")
val_min = cv2.getTrackbarPos("Value Min", "Slider")
val_max = cv2.getTrackbarPos("Value Max", "Slider")
# print(hue_min, hue_max, sat_min, sat_max, val_min, val_max)
# convert to HSV image
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
得到我們想要的顏色的上下界
現(xiàn)在我們已經(jīng)將圖像轉(zhuǎn)換為 HSV 比例,我們將更多地了解我們想要檢測和選擇的顏色的上限和下限。我們分別使用第35行和第36行的代碼來執(zhí)行此操作。
注意:確保此時(shí)已導(dǎo)入 numpy,否則會出現(xiàn)一些錯誤,numpy 預(yù)裝了 OpenCV-Python。
import cv2
import numpy as np
def do_nothing():
pass
# create slider here
cv2.namedWindow("Slider")
cv2.resizeWindow("Slider", 640, 480)
cv2.createTrackbar("Hue Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Hue Max", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Saturation Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Saturation Max", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Value Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Value Max", "Slider", 0, 255, do_nothing)
img = cv2.imread("./images/image1.jpg")
img = cv2.resize(img, (640, 480))
while True:
# extract the values from the trackbar
hue_min = cv2.getTrackbarPos("Hue Min", "Slider")
hue_max = cv2.getTrackbarPos("Hue Max", "Slider")
sat_min = cv2.getTrackbarPos("Saturation Min", "Slider")
sat_max = cv2.getTrackbarPos("Saturation Max", "Slider")
val_min = cv2.getTrackbarPos("Value Min", "Slider")
val_max = cv2.getTrackbarPos("Value Max", "Slider")
# print(hue_min, hue_max, sat_min, sat_max, val_min, val_max)
# set bounds
lower_bound = np.a(chǎn)rray([hue_min, sat_min, val_min])
upper_bound = np.a(chǎn)rray([hue_max, sat_max, val_max])
# convert to HSV image
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
創(chuàng)建一個(gè)掩碼并將其用于 Bitwise_and 操作
現(xiàn)在,我們需要創(chuàng)建一個(gè)圖像掩碼,并使用它來執(zhí)行按位操作,使用用戶使用滑動條設(shè)置的 UPPER 邊界和 LOWER 邊界。
這將使我們能夠選擇該顏色范圍內(nèi)的顏色。我們的代碼現(xiàn)在應(yīng)該如下所示,分別在第43行和第46行進(jìn)行了更改。
在第50行,我們簡單地顯示圖像。現(xiàn)在你可以調(diào)整滑塊并選擇你選擇的不同顏色。
import cv2
import numpy as np
def do_nothing():
pass
# create slider here
cv2.namedWindow("Slider")
cv2.resizeWindow("Slider", 640, 480)
cv2.createTrackbar("Hue Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Hue Max", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Saturation Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Saturation Max", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Value Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Value Max", "Slider", 0, 255, do_nothing)
img = cv2.imread("./images/image1.jpg")
img = cv2.resize(img, (640, 480))
while True:
# extract the values from the trackbar
hue_min = cv2.getTrackbarPos("Hue Min", "Slider")
hue_max = cv2.getTrackbarPos("Hue Max", "Slider")
sat_min = cv2.getTrackbarPos("Saturation Min", "Slider")
sat_max = cv2.getTrackbarPos("Saturation Max", "Slider")
val_min = cv2.getTrackbarPos("Value Min", "Slider")
val_max = cv2.getTrackbarPos("Value Max", "Slider")
# print(hue_min, hue_max, sat_min, sat_max, val_min, val_max)
# set bounds
lower_bound = np.a(chǎn)rray([hue_min, sat_min, val_min])
upper_bound = np.a(chǎn)rray([hue_max, sat_max, val_max])
# convert to HSV image
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# create mask
mask = cv2.inRange(hsv_img, lower_bound, upper_bound)
# we perform bitwise and operation here
resulting_img = cv2.bitwise_and(img, img, mask=mask)
# display the image here
cv2.imshow("Image", resulting_img)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
最后的潤色
現(xiàn)在我們已經(jīng)做到了這一點(diǎn),讓我們堆疊圖像以獲得更好的演示。可以在此代碼段中找到此代碼。
在第46行,我們創(chuàng)建了一個(gè)堆疊圖像并將其顯示在第49行。
import cv2
import numpy as np
def do_nothing():
pass
# create slider here
cv2.namedWindow("Slider")
cv2.resizeWindow("Slider", 640, 480)
cv2.createTrackbar("Hue Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Hue Max", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Saturation Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Saturation Max", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Value Min", "Slider", 0, 255, do_nothing)
cv2.createTrackbar("Value Max", "Slider", 0, 255, do_nothing)
img = cv2.imread("./images/image1.jpg")
img = cv2.resize(img, (640, 480))
while True:
hue_min = cv2.getTrackbarPos("Hue Min", "Slider")
hue_max = cv2.getTrackbarPos("Hue Max", "Slider")
sat_min = cv2.getTrackbarPos("Saturation Min", "Slider")
sat_max = cv2.getTrackbarPos("Saturation Max", "Slider")
val_min = cv2.getTrackbarPos("Value Min", "Slider")
val_max = cv2.getTrackbarPos("Value Max", "Slider")
# set bounds
lower_bound = np.a(chǎn)rray([hue_min, sat_min, val_min])
upper_bound = np.a(chǎn)rray([hue_max, sat_max, val_max])
# convert to HSV image
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# create mask
mask = cv2.inRange(hsv_img, lower_bound, upper_bound)
resulting_img = cv2.bitwise_and(img, img, mask=mask)
stacked_imgs = np.hstack([img, resulting_img])
# create a stacked image of the original and the HSV one.
cv2.imshow("Image", stacked_imgs)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
結(jié)論
有關(guān)該項(xiàng)目的視頻說明,請查看:

原文標(biāo)題 : 使用 OPENCV Python 進(jìn)行顏色檢測和選擇
發(fā)表評論
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
圖片新聞
-

落地?zé)o錫!京東首個(gè)物流機(jī)器人超級工廠來了
-

OpenAI發(fā)布的AI瀏覽器,市場為何反應(yīng)強(qiáng)烈?
-

馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-

機(jī)器人奧運(yùn)會戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-

存儲圈掐架!江波龍起訴佰維,索賠121萬
-

長安汽車母公司突然更名:從“中國長安”到“辰致科技”
-

豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-

字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
最新活動更多
-
6月30日立即申請?jiān)囉?> 【免費(fèi)試用】旭之源工業(yè)電源一一機(jī)器人的穩(wěn)定“心臟“
-
精彩回顧立即查看>> 【限時(shí)免費(fèi)】物理場仿真助力生物醫(yī)學(xué)領(lǐng)域技術(shù)創(chuàng)新
-
精彩回顧立即查看>> 【直播】 智測未來·2026海克斯康春季產(chǎn)品創(chuàng)新日
-
精彩回顧立即查看>> 【線下論壇】新唐科技×芯唐南京 2026 年度研討會
-
精彩回顧立即查看>> OFweek 2026(第十五屆)中國機(jī)器人產(chǎn)業(yè)大會
-
精彩回顧立即查看>> 維科杯· OFweek 2025中國機(jī)器人行業(yè)年度評選
推薦專題
-
2 華為,重大突破!
- 1 人形機(jī)器人“第一股”來了!宇樹科技即將上會
- 2 全球股市陷AI獨(dú)大結(jié)構(gòu)性瘋狂
- 3 AI狂歡遇上油價(jià)破百,全球股市還能漲多久? | 產(chǎn)聯(lián)看全球
- 4 DeepSeek融資500億,梁文鋒難逃資本局
- 5 谷歌2026 I/O大會完整回顧:模型依然重要,但智能體正在接管一切
- 6 全球資本,重倉中國機(jī)器人
- 7 Figure AI 交付突破350臺,陪跑特斯拉會迎來iPhone 時(shí)刻嗎?
- 8 Anthropic發(fā)布2028年全球AI領(lǐng)導(dǎo)力的兩種情景報(bào)告
- 9 “國產(chǎn)GPU第一股”摩爾線程首季扭虧,但造血能力仍待考驗(yàn)
- 10 特斯拉宣布監(jiān)督版FSD登陸中國?
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市


分享





