基于OpenCV實戰(zhàn):對象跟蹤
點擊下方“AI算法與圖像處理”,一起進步! 重磅干貨,第一時間送達

跟蹤對象的基本思想是找到對象的輪廓,基于HSV顏色值。
輪廓:突出顯示對象的圖像片段。例如,如果將二進制閾值應(yīng)用于具有(180,255)的圖像,則大于180的像素將以白色突出顯示,而其他則為黑色。白色部分稱為輪廓。
在繼續(xù)下面的操作之前,請在系統(tǒng)中安裝OpenCV。打開命令提示符并鍵入
pip install opencv-pythonimport cv2cam = cv2.VideoCapture(0)img = cam.read()[1] #_, img = cam.read()
參數(shù)0-用于主相機,例如在筆記本電腦網(wǎng)絡(luò)攝像頭中被視為主相機。1-代表中學,依此類推。

1、使用高斯濾波器對圖像進行歸一化。歸一化圖像可能會丟失許多小信息,但是我們需要歸一化/模糊圖像,以使我們的對象獲得均等的顏色分布。
#cv2.gaussianBlur(source_image,Kernal_size,Border_width)
Blur_img = cv2.GaussianBlur(img,(11,11),0)2、將圖像轉(zhuǎn)換為HSV顏色模型。
HSV = cv2.cvtColor(Blur_img, cv2.COLOR_BGR2HSV)
Obj_low = np.array([0,0,0]) # In my case (H,S,V)Obj_high = np.array([179,157,79])
在給定的HSV值范圍內(nèi)應(yīng)用二進制閾值,黑白Obj_low和Obj_high。
MASK = cv2.inRange(HSV, Obj_low, Obj_high)
#MASK2 = cv2.inRange(HSV,Obj2_low,Obj2_high)
如果嘗試跟蹤兩個不同的對象,則需要創(chuàng)建2個不同的蒙版,并最終在兩個蒙版上使用“按位與”運算符。
#mask = cv2.bitwise_and(mask1,mask2)
侵蝕和膨脹:侵蝕和膨脹填充閾值圖像中的黑色和白色斑點。這樣可使圖像更清晰,平滑并突出主要對象。
MASK = cv2.erode(MASK1, None, iterations=2)MASK = cv2.dilate(MASK1, None, iterations =2)

輪廓:突出顯示對象的圖像片段。例如,如果將二進制閾值應(yīng)用于具有(180,255)的圖像,則大于180的像素將以白色突出顯示,而其他則為黑色。白色部分稱為輪廓。
cnts = cv2.findContours(MASK1.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]if len(cnts)>0 :c = max(cnts, key = cv2.contourArea)
在上面給定的圖像中,整個白色邊界區(qū)域是輪廓。輪廓可能不止一個,但主要對象的面積將最大。所以選擇輪廓最大。然后..
得到主要物體的輪廓后,在輪廓上畫一個圓。
((x,y), radius) = cv2.minEnclosingCircle(c)M = cv2.moments(c)center = (int(M[‘m10’]/ M[‘m00’]), int(M[‘m01’]/ M[‘m00’]) )cv2.circle(img, center, 5, (0,0,255), -1)cv2.circle(img, center, int(radius), (0,0,255), 2)
對象跟蹤程序代碼
import cv2import numpy as npcam = cv2.VideoCapture(0)Obj_low = np.array([0,0,0])Obj_high = np.array([179,157,79])while True:img = cam.read()[1]img = cv2.resize(img, (800,600) )blur_img = cv2.GaussianBlur(img,(21,21),0)HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)MASK1 = cv2.inRange(HSV, Obj_low, Obj_high)MASK1 = cv2.erode(MASK1, None, iterations=2)MASK1 = cv2.dilate(MASK1, None, iterations =2)cnts = cv2.findContours(MASK1.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]center = Noneif len(cnts)>0 :c = max(cnts, key = cv2.contourArea)radius) = cv2.minEnclosingCircle(c)M = cv2.moments(c)center = (int(M['m10']/ M['m00']), int(M['m01']/ M['m00']) )if radius>10:center, 5, (0,0,255), -1)center, int(radius), (0,0,255), 2)window",img)k = cv2.waitKey(1)if k==27:breakcam.release()cv2.destroyAllWindows()
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有美顏、三維視覺、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群
個人微信(如果沒有備注不拉群!) 請注明:地區(qū)+學校/企業(yè)+研究方向+昵稱
下載1:何愷明頂會分享
在「AI算法與圖像處理」公眾號后臺回復(fù):何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結(jié)分析
下載2:終身受益的編程指南:Google編程風格指南
在「AI算法與圖像處理」公眾號后臺回復(fù):c++,即可下載。歷經(jīng)十年考驗,最權(quán)威的編程規(guī)范!
下載3 CVPR2021 在「AI算法與圖像處理」公眾號后臺回復(fù):CVPR,即可下載1467篇CVPR?2020論文 和 CVPR 2021 最新論文

