Python+OpenCV實現(xiàn)基于顏色的目標(biāo)識別
學(xué)習(xí)了一點opencv的知識于是找了個小項目來實踐一下。這里先說明一下,我的實現(xiàn)方法不見得是最好的(因為這只是一個用于練習(xí)的項目)僅作參考,也歡迎各位大佬指正。
任務(wù)
讓攝像頭識別到視野范圍內(nèi)的氣球并返回每個氣球的中心點坐標(biāo)。
因為場地固定,背景單一,所以省下來很多操作和處理。于是就有兩種解決思路:第一種是基于氣球形狀做輪廓提取,只要是閉合橢圓或圓形形就認(rèn)為是目標(biāo)物體;第二種是基于氣球顏色,只要符合目標(biāo)物體的顏色就認(rèn)為是目標(biāo)物體。
因為攝像頭是裝在四足機器人(它的任務(wù)是去扎氣球)身上的,所以它如果移動到攝像頭視野范圍內(nèi)氣球不成閉合橢圓或圓形的時候就無法識別了,再加上場地?zé)艄舛a(chǎn)生的陰影的問題,在初步實踐中發(fā)現(xiàn)經(jīng)過圖像處理的氣球不一定是閉合球形的。所以這種方法被我否決了。
于是我就采用了第二種方法,實現(xiàn)思路大概如下:
首先對圖像進行形態(tài)學(xué)處理,具體為將讀入的灰度圖進行一次濾波操作,將圖像轉(zhuǎn)化成HSV圖,然后進行腐蝕操作。接著就對目標(biāo)顏色進行識別和提取。然后提取圖像的輪廓,過濾掉輪廓圍成面積較小的物體后將剩余物體視為目標(biāo)。接下來就繪制目標(biāo)的外接矩形(不必要,用于調(diào)試。當(dāng)然也為了帥氣的視覺效果)。最后計算目標(biāo)的中心點,返回中心點,并繪制在圖上。
話不多說我們來看一下具體的代碼實現(xiàn)吧
主要代碼
import cv2 #import matplotlib.pyplot as plt import numpy as np #定義一個展示圖片的函數(shù) def cv_show(name,img): cv2.imshow(name,img) cv2.waitKey(0) cv2.destroyAllWindows() #定義一個形態(tài)學(xué)處理的函數(shù) def good_thresh_img(img): gs_frame = cv2.GaussianBlur(img, (5, 5), 0) #高斯濾波 hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV) # 轉(zhuǎn)化成HSV圖像 erode_hsv = cv2.erode(hsv, None, iterations=2) return erode_hsv #定義一個識別目標(biāo)顏色并處理的函數(shù) def select_color_img(target_color,img): for i in target_color: mask=cv2.inRange(erode_hsv,color_dist[i]['Lower'],color_dist[i]['Upper']) if(i==target_color[0]): inRange_hsv=cv2.bitwise_and(erode_hsv,erode_hsv,mask = mask) cv_show('res',inRange_hsv)#不必要,用于調(diào)試 else: inRange_hsv1=cv2.bitwise_and(erode_hsv,erode_hsv,mask = mask) cv_show('res1',inRange_hsv1)#不必要,用于調(diào)試 inRange_hsv=cv2.add(inRange_hsv,inRange_hsv1) cv_show('res2',inRange_hsv)#不必要,用于調(diào)試 return inRange_hsv #定義一個提取輪廓的函數(shù) def extract_contour(img): inRange_gray = cv2.cvtColor(final_inRange_hsv,cv2.COLOR_BGR2GRAY) contours,hierarchy = cv2.findContours(inRange_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) return contours #定義一個尋找目標(biāo)并繪制外接矩形的函數(shù) def find_target(contours,draw_img): for c in contours: if cv2.contourArea(c) < 2000: #過濾掉較面積小的物體 continue else: target_list.append(c) #將面積較大的物體視為目標(biāo)并存入目標(biāo)列表 for i in target_list: #繪制目標(biāo)外接矩形 rect = cv2.minAreaRect(i) box = cv2.boxPoints(rect) cv2.drawContours(draw_img, [np.int0(box)], -1, (0, 255, 255), 2) return draw_img #定義一個繪制中心點坐標(biāo)的函數(shù) def draw_center(target_list,draw_img): for c in target_list: M = cv2.moments(c) #計算中心點的x、y坐標(biāo) center_x = int(M['m10']/M['m00']) center_y = int(M['m01']/M['m00']) print('center_x:',center_x) #打?。ǚ祷兀┲行狞c的x、y坐標(biāo) print('center_y:',center_y) cv2.circle(draw_img,(center_x,center_y),7,128,-1)#繪制中心點 str1 = '(' + str(center_x)+ ',' +str(center_y) +')' #把坐標(biāo)轉(zhuǎn)化為字符串 cv2.putText(draw_img,str1,(center_x-50,center_y+40),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,0),2,cv2.LINE_AA)#繪制坐標(biāo)點位 return draw_img ###主函數(shù)部分 #創(chuàng)建顏色字典 color_dist = {'red': {'Lower': np.array([0, 60, 60]), 'Upper': np.array([6, 255, 255])}, 'yellow': {'Lower': np.array([15, 160, 50]), 'Upper': np.array([35, 255, 255])}, 'green': {'Lower': np.array([50, 50, 50]), 'Upper': np.array([130, 255, 255])}, } #目標(biāo)顏色 target_color = ['green','yellow'] #創(chuàng)建目標(biāo)列表 target_list=[] img = cv2.imread(r'D:lesson\balloom.jpg',cv2.COLOR_BGR2RGB) #讀入圖像(直接讀入灰度圖) draw_img = img.copy() #為保護原圖像不被更改而copy了一份,下面對圖像的修改都是對這個副本進行的 erode_hsv = good_thresh_img(img) final_inRange_hsv = select_color_img(target_color,erode_hsv) contours = extract_contour(final_inRange_hsv) draw_img = find_target(contours,draw_img) final_img = draw_center(target_list,draw_img) cv_show('final_img',final_img)
效果展示
顏色提取效果:
繪制外接矩形及中心點的效果:
到此這篇關(guān)于Python+OpenCV實現(xiàn)基于顏色的目標(biāo)識別的文章就介紹到這了,更多相關(guān)Python OpenCV基于顏色的目標(biāo)識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pytest+Yaml+Excel?接口自動化測試框架的實現(xiàn)示例
本文主要介紹了Pytest+Yaml+Excel?接口自動化測試框架,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01python實現(xiàn)opencv+scoket網(wǎng)絡(luò)實時圖傳
這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)opencv+scoket網(wǎng)絡(luò)實時圖傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03Python3 itchat實現(xiàn)微信定時發(fā)送群消息的實例代碼
使用微信,定時往指定的微信群里發(fā)送指定信息。接下來通過本文給大家分享Python3 itchat實現(xiàn)微信定時發(fā)送群消息的實例代碼,需要的朋友可以參考下2019-07-07