Python+OpenCV實(shí)現(xiàn)圖片及視頻中選定區(qū)域顏色識別
近期,需要實(shí)現(xiàn)檢測攝像頭中指定坐標(biāo)區(qū)域內(nèi)的主體顏色,通過查閱大量相關(guān)的內(nèi)容,最終實(shí)現(xiàn)代碼及效果如下,具體的實(shí)現(xiàn)步驟在代碼中都詳細(xì)注釋,代碼還可以進(jìn)一步優(yōu)化,但提升有限。
主要實(shí)現(xiàn)過程:按不同顏色的取值范圍,對圖像進(jìn)行循環(huán)遍歷,轉(zhuǎn)換為灰度圖,將本次遍歷的顏色像素轉(zhuǎn)換為白色,對白色部分進(jìn)行膨脹處理,使其更加連續(xù),計算白色部分外輪廓包圍的面積累加求和,比較每種顏色圍起來面積,保存最大值及其顏色,所有顏色遍歷完后,返回最大值對應(yīng)的顏色,顯示在圖像上
如果有類似的顏色識別的任務(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)對圖片中目標(biāo)區(qū)域顏色的識別 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]) # 在后兩個參數(shù)范圍內(nèi)的值變成255 binary = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)[1] # 在灰度圖片中,像素值大于127的都變成255,[1]表示調(diào)用圖像,也就是該函數(shù)第二個返回值 # 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ù)第二個返回值輪廓 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 # 對視頻或攝像頭獲取的影像目標(biāo)區(qū)域顏色進(jìn)行識別 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é)只對攝像頭有效 cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 750) while cap.isOpened(): ret, frame0 = cap.read() # 對圖像幀進(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è)置檢測顏色的區(qū)域,四個頂點(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ū)域顏色識別的文章就介紹到這了,更多相關(guān)Python OpenCV顏色識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python+Flask實(shí)現(xiàn)日志在web網(wǎng)頁實(shí)時更新顯示
日志是一種可以追蹤某些軟件運(yùn)行時所發(fā)生事件的方法,下面這篇文章主要給大家介紹了關(guān)于使用python+Flask實(shí)現(xiàn)日志在web網(wǎng)頁實(shí)時更新顯示的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Python 利用pandas和mysql-connector獲取Excel數(shù)據(jù)寫入到MySQL數(shù)據(jù)庫
在實(shí)際應(yīng)用中,我們可能需要將Excel表格中的數(shù)據(jù)導(dǎo)入到MySQL數(shù)據(jù)庫中,以便于進(jìn)行進(jìn)一步的數(shù)據(jù)分析和處理,本文將介紹如何使用Python將Excel表格中的數(shù)據(jù)插入到MySQL數(shù)據(jù)庫中,需要的朋友可以參考下2023-10-10可用于監(jiān)控 mysql Master Slave 狀態(tài)的python代碼
用于監(jiān)控MySQL Master Slave 狀態(tài)的python代碼,有需要的朋友可以參考下2013-02-02Pyqt實(shí)現(xiàn)無邊框窗口拖動以及窗口大小改變
這篇文章主要為大家詳細(xì)介紹了Pyqt實(shí)現(xiàn)無邊框窗口拖動及大小改變的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04Django Rest framework權(quán)限的詳細(xì)用法
這篇文章主要介紹了Django Rest framework權(quán)限的詳細(xì)用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07Python numpy 數(shù)組的向量化運(yùn)算操作方法
這篇文章主要介紹了Python numpy數(shù)組的向量化運(yùn)算操作方法,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06Python語法糖for?else循環(huán)語句里的break使用詳解
這篇文章主要介紹了Python語法糖之for?else循環(huán)語句里的break使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05