Python+OpenCV實(shí)現(xiàn)圖片及視頻中選定區(qū)域顏色識(shí)別
近期,需要實(shí)現(xiàn)檢測(cè)攝像頭中指定坐標(biāo)區(qū)域內(nèi)的主體顏色,通過查閱大量相關(guān)的內(nèi)容,最終實(shí)現(xiàn)代碼及效果如下,具體的實(shí)現(xiàn)步驟在代碼中都詳細(xì)注釋,代碼還可以進(jìn)一步優(yōu)化,但提升有限。
主要實(shí)現(xiàn)過程:按不同顏色的取值范圍,對(duì)圖像進(jìn)行循環(huán)遍歷,轉(zhuǎn)換為灰度圖,將本次遍歷的顏色像素轉(zhuǎn)換為白色,對(duì)白色部分進(jìn)行膨脹處理,使其更加連續(xù),計(jì)算白色部分外輪廓包圍的面積累加求和,比較每種顏色圍起來(lái)面積,保存最大值及其顏色,所有顏色遍歷完后,返回最大值對(duì)應(yīng)的顏色,顯示在圖像上
如果有類似的顏色識(shí)別的任務(wù),可參考以下代碼修改后實(shí)現(xiàn)具體需求
colorList.py
import numpy as np
import collections
# 將rgb圖像轉(zhuǎn)換為hsv圖像后,確定不同顏色的取值范圍
def getColorList():
dict = collections.defaultdict(list)
# black
lower_black = np.array([0, 0, 0])
upper_black = np.array([180, 255, 46])
color_list_black = []
color_list_black.append(lower_black)
color_list_black.append(upper_black)
dict['black'] = color_list_black
# gray
lower_gray = np.array([0, 0, 46])
upper_gray = np.array([180, 43, 220])
color_list_gray= []
color_list_gray.append(lower_gray)
color_list_gray.append(upper_gray)
dict['gray'] = color_list_gray
# white
lower_white = np.array([0, 0, 221])
upper_white = np.array([180, 30, 255])
color_list_white = []
color_list_white.append(lower_white)
color_list_white.append(upper_white)
dict['white'] = color_list_white
# red
lower_red = np.array([156, 43, 46])
upper_red = np.array([180, 255, 255])
color_list_red = []
color_list_red.append(lower_red)
color_list_red.append(upper_red)
dict['red'] = color_list_red
# red2
lower_red = np.array([0, 43, 46])
upper_red = np.array([10, 255, 255])
color_list_red2 = []
color_list_red2.append(lower_red)
color_list_red2.append(upper_red)
dict['red2'] = color_list_red2
# orange
lower_orange = np.array([11, 43, 46])
upper_orange = np.array([25, 255, 255])
color_list_orange = []
color_list_orange.append(lower_orange)
color_list_orange.append(upper_orange)
dict['orange'] = color_list_orange
# yellow
lower_yellow = np.array([26, 43, 46])
upper_yellow = np.array([34, 255, 255])
color_list_yellow = []
color_list_yellow.append(lower_yellow)
color_list_yellow.append(upper_yellow)
dict['yellow'] = color_list_yellow
# green
lower_green = np.array([35, 43, 46])
upper_green = np.array([77, 255, 255])
color_list_green = []
color_list_green.append(lower_green)
color_list_green.append(upper_green)
dict['green'] = color_list_green
# cyan
lower_cyan = np.array([78, 43, 46])
upper_cyan = np.array([99, 255, 255])
color_list_cyan = []
color_list_cyan.append(lower_cyan)
color_list_cyan.append(upper_cyan)
dict['cyan'] = color_list_cyan
# blue
lower_blue = np.array([100, 43, 46])
upper_blue = np.array([124, 255, 255])
color_list_blue = []
color_list_blue.append(lower_blue)
color_list_blue.append(upper_blue)
dict['blue'] = color_list_blue
# purple
lower_purple = np.array([125, 43, 46])
upper_purple = np.array([155, 255, 255])
color_list_purple = []
color_list_purple.append(lower_purple)
color_list_purple.append(upper_purple)
dict['purple'] = color_list_purple
return dict
if __name__ == '__main__':
color_dict = getColorList()
print(color_dict)
num = len(color_dict)
print('num=', num)
for d in color_dict:
print('key=', d)
print('value=', color_dict[d][1])image_color_realize.py
import cv2
import colorList
# 實(shí)現(xiàn)對(duì)圖片中目標(biāo)區(qū)域顏色的識(shí)別
def get_color(frame):
print('go in get_color')
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
maxsum = 0
color = None
color_dict = colorList.getColorList()
# count = 0
for d in color_dict:
mask = cv2.inRange(hsv, color_dict[d][0], color_dict[d][1]) # 在后兩個(gè)參數(shù)范圍內(nèi)的值變成255
binary = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)[1] # 在灰度圖片中,像素值大于127的都變成255,[1]表示調(diào)用圖像,也就是該函數(shù)第二個(gè)返回值
# cv2.imshow("0",binary)
# cv2.waitKey(0)
# count+=1
binary = cv2.dilate(binary, None, iterations=2) # 使用默認(rèn)內(nèi)核進(jìn)行膨脹操作,操作兩次,使縫隙變小,圖像更連續(xù)
cnts = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] # 獲取該函數(shù)倒數(shù)第二個(gè)返回值輪廓
sum = 0
for c in cnts:
sum += cv2.contourArea(c) # 獲取該顏色所有輪廓圍成的面積的和
# print("%s , %d" %(d, sum ))
if sum > maxsum:
maxsum = sum
color = d
if color == 'red2':
color = 'red'
elif color == 'orange':
color = 'yellow'
elif color == 'purple' or color == 'blue' or color == 'cyan' or color == 'white' or color == 'green':
color = 'normal'
return color
if __name__ == '__main__':
filename = "C:/Users/admin/Desktop/water_samples/live01.jpg"
frame = cv2.imread(filename)
# frame = frame[180:280, 180:380] # [y:y+h, x:x+w] 注意x,y順序
color = get_color(frame)
# 繪制文本
cv2.putText(img=frame,text=color,org=(20,50),fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=1.0,color=(0,255,0),thickness=2)
# cv2.namedWindow('frame',cv2.WINDOW_NORMAL) # 設(shè)置顯示窗口可調(diào)節(jié)
cv2.imshow('frame',frame)
cv2.waitKey(0)
video_color_realize.py
import cv2
import xf_color
# 對(duì)視頻或攝像頭獲取的影像目標(biāo)區(qū)域顏色進(jìn)行識(shí)別
cap = cv2.VideoCapture("C:/Users/admin/Desktop/water_samples/01.mp4")
# cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1100) # 這里窗口大小調(diào)節(jié)只對(duì)攝像頭有效
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 750)
while cap.isOpened():
ret, frame0 = cap.read()
# 對(duì)圖像幀進(jìn)行翻轉(zhuǎn)(因?yàn)閛pencv圖像和我們正常是反著的) 視頻是正常的,攝像頭是反轉(zhuǎn)的
# frame0 = cv2.flip(src=frame0, flipCode=2)
# frame = frame[180:280, 180:380] # [y:y+h, x:x+w]
# frame = frame0[200:400, 100:300] # 設(shè)置檢測(cè)顏色的區(qū)域,四個(gè)頂點(diǎn)坐標(biāo)
frame = frame0
# frame=cv2.resize(src=frame,dsize=(750,600))
hsv_frame = cv2.cvtColor(src=frame, code=cv2.COLOR_BGR2HSV)
# 獲取讀取的幀的高寬
height, width, channel = frame.shape
color = xf_color.get_color(hsv_frame)
# 繪制文本
cv2.putText(img=frame0, text=color, org=(20, 50), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=1.0, color=(0, 255, 0), thickness=2)
cv2.imshow('frame', frame0)
key = cv2.waitKey(1)
if key == 27:
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
print('Pycharm')
效果如下:
示例圖片1

示例圖片2

示例圖片3

到此這篇關(guān)于Python+OpenCV實(shí)現(xiàn)圖片及視頻中選定區(qū)域顏色識(shí)別的文章就介紹到這了,更多相關(guān)Python OpenCV顏色識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python?OpenCV實(shí)現(xiàn)簡(jiǎn)單的顏色識(shí)別功能(對(duì)紅色和藍(lán)色識(shí)別并輸出)
- Python+OpenCV實(shí)現(xiàn)基于顏色的目標(biāo)識(shí)別
- python+opencv實(shí)現(xiàn)文字顏色識(shí)別與標(biāo)定功能
- python實(shí)現(xiàn)簡(jiǎn)單顏色識(shí)別程序
- 50行Python代碼實(shí)現(xiàn)視頻中物體顏色識(shí)別和跟蹤(必須以紅色為例)
- 淺談Python3識(shí)別判斷圖片主要顏色并和顏色庫(kù)進(jìn)行對(duì)比的方法
- python微信跳一跳系列之棋子定位顏色識(shí)別
- python識(shí)別圖片中指定顏色的圖案并保存為圖片
相關(guān)文章
Python內(nèi)置的字符串處理函數(shù)詳細(xì)整理(覆蓋日常所用)
Python內(nèi)置的字符串處理函數(shù)整理,有字母處理、格式化相關(guān)、字符串搜索相關(guān)、字符串替換相關(guān)等等2014-08-08
使用Python中OpenCV和深度學(xué)習(xí)進(jìn)行全面嵌套邊緣檢測(cè)
這篇文章主要介紹了使用Python中OpenCV和深度學(xué)習(xí)進(jìn)行全面嵌套邊緣檢測(cè),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Jupyter?Notebook出現(xiàn)不是內(nèi)部或外部的命令解決方案
這篇文章主要介紹了Jupyter?Notebook出現(xiàn)不是內(nèi)部或外部的命令解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
詳談Python中列表list,元祖tuple和numpy中的array區(qū)別
下面小編就為大家分享一篇詳談Python中列表list,元祖tuple和numpy中的array區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-04-04
Python入門教程(十八)Python的For循環(huán)
這篇文章主要介紹了Python入門教程(十八)Python的For循環(huán),Python是一門非常強(qiáng)大好用的語(yǔ)言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下2023-04-04
舉例講解Python程序與系統(tǒng)shell交互的方式
這篇文章主要介紹了Python程序與系統(tǒng)shell交互的方式,舉了一個(gè)非常簡(jiǎn)單的hello world的例子,需要的朋友可以參考下2015-04-04
使用python創(chuàng)建股票的時(shí)間序列可視化分析
這篇文章主要為大家詳細(xì)介紹了python創(chuàng)建股票的時(shí)間序列可視化分析,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03

