Python?OpenCV實(shí)現(xiàn)簡單的顏色識別功能(對紅色和藍(lán)色識別并輸出)
攝像頭識別紅色和藍(lán)色并框選,當(dāng)該顏色為攝像頭屏幕上大多數(shù)顏色時打印出該顏色的名稱
1.調(diào)包
import cv2 import numpy as np from matplotlib import pyplot as plt
2.初始設(shè)置
lower_red = np.array([0, 50, 100]) #為紅色和藍(lán)色設(shè)置閾值用來為之后處理圖像準(zhǔn)備
upper_red = np.array([10, 255, 255]) #該閾值是在HSV顏色空間下
lower_blue = np.array([100,50,100])
upper_blue = np.array([124, 255, 255])
red = (0,0,225) #設(shè)置紅色和藍(lán)色在BGR顏色空間下的數(shù)值元組
blue = (225,0,0)
cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE)#設(shè)置窗口'video',大小為自適應(yīng)模式
cv2.resizeWindow('video',640,480) #為窗口設(shè)置寬度(640)和高度(480)3.圖像處理,提取顏色
def img_process(img,lower,upper):
"""根據(jù)閾值處理圖像,提取閾值內(nèi)的顏色。返回處理后只留下指定顏色的圖像(其余為黑色)
img:原圖像;lower:最低閾值;upper:最高閾值"""
kernel = np.ones((35, 35), np.uint8) #創(chuàng)建一個35x35卷積核,卷積核內(nèi)元素全為1
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #將BGR圖像轉(zhuǎn)化為HSV圖像,方便顏色提取
Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel) #用卷積核對圖像進(jìn)行形態(tài)學(xué)開運(yùn)算操作,去除噪聲
mask = cv2.inRange(Open, lower, upper) #開運(yùn)算得到的圖像用閾值進(jìn)行二值化處理(處理后的結(jié)果為在閾值內(nèi)的部分變?yōu)榘咨?,不在閾值?nèi)的部分為黑色)
res = cv2.bitwise_and(img, img, mask = mask) #二值化處理后的圖像與原圖進(jìn)行位與運(yùn)算(處理后在閾值內(nèi)的顏色變?yōu)樵伾辉陂撝祪?nèi)的部分仍為黑色)
return res #該函數(shù)的返回值為位與運(yùn)算之后的圖像,此圖像只保留了在閾值內(nèi)的圖像,其余部分為黑色4.輪廓繪制
def cnts_draw(img,res,color):
"""在原圖像上繪出指定顏色的輪廓。無返回值
img:原圖像;res:只剩某顏色的位與運(yùn)算后的圖像;color:輪廓的顏色"""
canny = cv2.Canny(res,100,200)#Canny邊緣檢測算法,用來描繪圖像中物體的邊緣,(100,200為此函數(shù)的兩個閾值,該閾值越小輪廓的細(xì)節(jié)越豐富)
contours, hierarchy=cv2.findContours(canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#尋找圖像輪廓的函數(shù),這里先用Canny算法得到只保留輪廓的圖像方便輪廓的找尋
if len(contours) == 0:#傳遞到max函數(shù)中的輪廓不能為空
cv2.imshow('video',img)
return
else:
max_cnt = max(contours , key = cv2.contourArea)#找到輪廓中最大的一個
cv2.drawContours(img, max_cnt,-1,color,2)#在原圖上繪制這個最大輪廓
(x,y,w,h) = cv2.boundingRect(max_cnt)#找到這個最大輪廓的最大外接矩形,返回的(x,y)為這個矩形右下角的頂點(diǎn),w為寬度,h為高度
cv2.rectangle(img,(x,y),(x+w,y+h),color,3)#在原圖上繪制這個矩形
cv2.imshow('video', img)#展示原圖5.顏色識別
def colorfind(img):
"""找到原圖像最多的顏色,當(dāng)該顏色為紅色或藍(lán)色時打印出來該顏色的名稱,無返回值
img:原圖像"""
kernel = np.ones((35, 35), np.uint8)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel)#以上為圖像處理
hist = cv2.calcHist([Open],[0],None,[180],[0,180])#對Open圖像的H通道進(jìn)行直方圖統(tǒng)計
hist_max = np.where(hist == np.max(hist))#找到直方圖hist中列方向最大的點(diǎn)hist_max
if 0 < hist_max[0] < 10:#hist_max[0]為hist_max的行方向的值,即H的值,H在0~10為紅色
print('red')
elif 100 < hist_max[0] < 124:#H在100~124為藍(lán)色
print('blue')
else : #H不在前兩者之間跳出函數(shù)
return
#可以添加對H的判斷來識別更多的顏色下面是OpenCV中HSV空間顏色對照表

6.程序主體
if __name__ == "__main__":
cap = cv2.VideoCapture(0)#打開攝像頭(0代表打開默認(rèn)攝像頭,若有兩個攝像頭可用1表示打開另一個攝像頭)
while cap.isOpened():#判斷攝像頭是否正常打開
flag, frame = cap.read()#讀取攝像頭返回兩個參數(shù),flag是布爾類型代表攝像頭是否正常讀取,frame是從攝像頭讀取的圖像
if not flag: #若無法讀取則跳出循環(huán)
print("無法讀取攝像頭!")
break
else:
if frame is not None: #判斷攝像頭有無畫面
res_blue = img_process(frame,lower_blue,upper_blue)
res_red = img_process(frame,lower_red,upper_red)
cnts_draw(frame,res_blue,blue)
cnts_draw(frame,res_red,red)
colorfind(frame)
key = cv2.waitKey(10)
if key == 27:
break
else:
print("無畫面")
break
cap.release()#釋放資源,停止讀取攝像頭
cv2.destroyAllWindows()#關(guān)閉所有窗口完整源代碼
import cv2
import numpy as np
from matplotlib import pyplot as plt
lower_red = np.array([0, 50, 100])
upper_red = np.array([10, 255, 255])
lower_blue = np.array([100,50,100])
upper_blue = np.array([124, 255, 255]) #若繪制輪廓與自己期望的識別結(jié)果相差較大,可通過調(diào)整閾值來改變識別結(jié)果
red = (0,0,225)
blue = (225,0,0)
cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE)
cv2.resizeWindow('video',640,480)
def img_process(img,lower,upper):
"""根據(jù)閾值處理圖像,提取閾值內(nèi)的顏色。返回處理后只留下指定顏色的圖像(其余為黑色)
img:原圖像;lower:最低閾值;upper:最高閾值"""
kernel = np.ones((35, 35), np.uint8)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel)
mask = cv2.inRange(Open, lower, upper)
res = cv2.bitwise_and(img, img, mask = mask)
return res
def cnts_draw(img,res,color):
"""在原圖像上繪出指定顏色的輪廓。無返回值
img:原圖像;res:只剩某顏色的位與運(yùn)算后的圖像;color:輪廓的顏色"""
canny = cv2.Canny(res,100,200)
contours, hierarchy=cv2.findContours(canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
if len(contours) == 0:
cv2.imshow('video',img)
return
else:
max_cnt = max(contours , key = cv2.contourArea)
cv2.drawContours(img, max_cnt,-1,color,2)
(x,y,w,h) = cv2.boundingRect(max_cnt)
cv2.rectangle(img,(x,y),(x+w,y+h),color,3)
cv2.imshow('video', img)
def colorfind(img):
"""找到原圖像最多的顏色,當(dāng)該顏色為紅色或藍(lán)色時打印出來該顏色的名稱,無返回值
img:原圖像"""
kernel = np.ones((35, 35), np.uint8)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel)
hist = cv2.calcHist([Open],[0],None,[180],[0,180])
hist_max = np.where(hist == np.max(hist))
if 0 < hist_max[0] < 10:
print('red')
elif 100 < hist_max[0] < 124:
print('blue')
else :
return
if __name__ == "__main__":
cap = cv2.VideoCapture(0)
while cap.isOpened():
flag, frame = cap.read()
if not flag:
print("無法讀取攝像頭!")
break
else:
if frame is not None:
res_blue = img_process(frame,lower_blue,upper_blue)
res_red = img_process(frame,lower_red,upper_red)
cnts_draw(frame,res_blue,blue)
cnts_draw(frame,res_red,red)
colorfind(frame)
key = cv2.waitKey(10)
if key == 27:
break
else:
print("無畫面")
break
cap.release()
cv2.destroyAllWindows()下面是程序運(yùn)行的實(shí)例


總結(jié)
到此這篇關(guān)于Python OpenCV實(shí)現(xiàn)簡單的顏色識別功能的文章就介紹到這了,更多相關(guān)Python OpenCV實(shí)現(xiàn)顏色識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python獲取當(dāng)前腳本文件夾(Script)的絕對路徑方法代碼
在本篇文章中小編給各位整理了關(guān)于Python獲取當(dāng)前腳本文件夾(Script)的絕對路徑實(shí)例代碼內(nèi)容,有需要的朋友們學(xué)習(xí)下。2019-08-08
Python中數(shù)字以及算數(shù)運(yùn)算符的相關(guān)使用
這篇文章主要介紹了Python中數(shù)字以及算數(shù)運(yùn)算符的相關(guān)使用,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-10-10
使用Python requests庫發(fā)送JSON數(shù)據(jù)的POST請求步驟
在Python這個強(qiáng)大的編程語言中,requests庫是一個廣泛使用且功能強(qiáng)大的HTTP請求庫,發(fā)送POST請求并附帶JSON數(shù)據(jù)是一個非常常見的需求,本文給大家介紹了如何用Python的requests庫發(fā)送JSON數(shù)據(jù)的POST請求,需要的朋友可以參考下2024-06-06
python 使用事件對象asyncio.Event來同步協(xié)程的操作
這篇文章主要介紹了python 使用事件對象asyncio.Event來同步協(xié)程的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python利用Selenium實(shí)現(xiàn)自動化分頁處理和信息提取
在 Web 自動化測試或數(shù)據(jù)抓取場景中,分頁處理是一個常見的需求,通過 Selenium,我們可以實(shí)現(xiàn)對多頁面內(nèi)容的自動遍歷,并從中提取所需的信息,本文將詳細(xì)介紹如何利用 Selenium 進(jìn)行自動化分頁處理和信息提取,需要的朋友可以參考下2025-06-06
一文帶你深入理解python中pytest-repeat插件的工作原理
這篇文章主要和大家一起深入探討到底pytest_repeat插件的具體功能是如何實(shí)現(xiàn)的呢,相信具體了解了該插件,其他三方插件也可以很快了解它內(nèi)部運(yùn)行機(jī)制,所以本文詳細(xì)講解了python pytest-repeat插件的工作原理,需要的朋友可以參考下2023-09-09
使用Python創(chuàng)建和定制SmartArt圖形的示例代碼
在制作專業(yè)的PowerPoint演示文稿時,SmartArt圖形是一種強(qiáng)大的可視化工具,能夠?qū)?fù)雜的信息、流程或?qū)哟谓Y(jié)構(gòu)以直觀的方式呈現(xiàn),本文將深入探討如何使用Python在PowerPoint演示文稿中 programmatically創(chuàng)建、定制和操作SmartArt圖形,需要的朋友可以參考下2026-04-04

