最近台猴,初學OpenCV-python朽合,參考資料,做了一個簡單的基于顏色識別的學生證追蹤程序卿吐,與大家分享如下:
?程序主要由三部分構成:
一旁舰,攝像頭的初始化與采集圖像
?二,圖像處理算法
?三嗡官,錄制視頻
程序如下:
(1)打開我的PyScripter編輯器,導入一些必要的包:cv2 是 Opencv 包毯焕;numpy 是 矩陣運算相關的包
>>>import cv2
>>>import numpy as np
(2)開啟攝像頭并配置好相關參數(shù)衍腥,為圖像的采集與保存做準備
>>>cap = cv2.VideoCapture(0)
>>>fourcc = cv2.cv.CV_FOURCC("D", "I", "B", " ")
>>>out = cv2.VideoWriter( 'StudentID_Tracking.avi', fourcc, ?20, ?(640,480) ?)
做好準備工作后,開始進入正題纳猫,即一個實時跟蹤顏色并顯示的大循環(huán)婆咸。我們嘗試著用 OpenCV 包中的 cv2.inRange() 函數(shù)來識別hsv空間下的指定顏色芜辕。該函數(shù)需要輸入三個參數(shù)尚骄。
參數(shù)1是待處理的圖像變量;
參數(shù)2是指定顏色的hsv下限值侵续;
參數(shù)3是指定顏色的hsv上限值倔丈;
函數(shù)返回值是處理后的二值圖像。
(對于HSV顏色空間與RGB顏色空間的相關知識状蜗,可以參考以下鏈接)
通過 cv2.cvtColor() 函數(shù)可以將指定圖像轉換到指定的顏色空間需五。該函數(shù)需要輸入兩個參數(shù)。
參數(shù)1是待處理的圖像變量轧坎;
參數(shù)2是指定轉換到相應的顏色空間宏邮;
函數(shù)返回值是轉換后的圖像變量。
原圖像與轉換后的圖像如下所示:
從兩幅圖像的對比結果上看,很顯然蜜氨,由于受到光線械筛,雜色等的影響,顏色識別的效果并不理想飒炎,那么埋哟,我們嘗試著用一些簡單的形態(tài)學處理方法來解決這個問題。
首先厌丑,我們可以嘗試先通過簡單的腐蝕運算來消除多余的細小的噪聲點定欧。
>>>mask = cv2.erode(mask, None, iterations=2)
接著,通過膨脹運算來消除各個分散區(qū)域之間的細小縫隙怒竿。
>>>mask = cv2.dilate(mask, None, iterations=7 )
最后砍鸠,再用簡單的腐蝕運算來盡可能的還原色塊的本來形狀和大小。
>>>mask = cv2.erode(mask, None, iterations=5)
以下是形態(tài)學方法處理前后的圖像對比:
當然耕驰,如果還有一種叫輪廓近似的方法爷辱,當你由于各種原因,所想要采集的圖像區(qū)域并不是一個規(guī)則的圖像朦肘,而存在著或多或少饭弓,或深或淺,或大或小的毛刺媒抠,那么可以嘗試用這種方法還原一個近似的規(guī)則形狀弟断。相關的函數(shù)有 cv2.approxPolyDP() ,有興趣的朋友可以嘗試一下趴生。
處理后的二值化圖像方便我們進行輪廓的提取阀趴。需要用到的函數(shù)是 cv2.findContours() 。該函數(shù)需要輸入三個參數(shù)苍匆。
參數(shù)1是待處理的圖像變量刘急;
參數(shù)2是指定輪廓的檢索模式;
參數(shù)3是指定輪廓的近似方法浸踩;
該函數(shù)返回兩個值叔汁,1是輪廓本身,2是每條輪廓對應的屬性检碗。
>>>cnts = cv2.findContours( mask.copy(), cv2.RETR_CCOMP,
cv2.CHAIN_APPROX_SIMPLE)[-2]
當識別到輪廓時据块,我們通過尋找最大的輪廓來消除噪聲干擾,以確保識別的準確性后裸。
>>>c = max( cnts, key = cv2.contourArea )
通過以下兩條語句瑰钮,計算所勾勒輪廓的質心。
>>>M = cv2.moments( c )
>>>center = ( int ( M[ "m10" ] / M[ "m00" ] ), int ( M[ "m01" ] / M[ "m00" ] ) )
在質心位置畫出一個藍色的實心圓點微驶。
>>>cv2.circle( background, center, 5, ( 255, 0, 0 ), -1 )
至此浪谴,我們已經完成了本程序最核心的部分开睡。
不要忘了,我們還要錄屏:
>>>out.write( background )
錄制出來的視頻在文末苟耻。
最后篇恒,我們仍需要再做一些收尾工作:通過按下鍵盤上的 ‘ q ’ 鍵退出大循環(huán)。
>>>key = cv2.waitKey(1) & 0xFF
>>> ? ? ? if key == ord("q"):
>>> ? ? ? ? ? ? ?break
同時要釋放攝像頭和銷毀窗口凶杖。
>>>cap.release()
>>>out.release()
>>>cv2.destroyAllWindows()
至此胁艰,一個基于顏色識別的學生證追蹤程序已經完成。
在編寫這個程序的過程中智蝠,我還編寫了兩個小工具腾么。主要可以幫助我們確定指定顏色區(qū)域的hsv值上限和hsv值下限。
下面分別介紹一下這兩個小工具:
(1)摳圖工具:運用此工具杈湾,再圖像界面上解虱,按下左鍵取起始點后松開,通過移動鼠標可以拉出一個矩形漆撞,按下右鍵后可以確定矩形的邊框殴泰,從而摳出一個指定的矩形區(qū)域,并返回該區(qū)域的hsv的上限值與下限值浮驳。
在該文件目錄下輸入以下兩行代碼悍汛,即可彈出圖像界面。
>>>import Detectcolor2hsv
>>>Detectcolor2hsv.detectcolor2hsv( 'opencvlogo.jpg' )
效果圖如下(左邊邊框內為截取的圖形至会,右邊為輸出結果):
(2)hsv畫板:玩一下此畫板离咐,可以加深你對hsv顏色空間的理解,同時奉件,也有利于確定hsv值健霹。
在該文件目錄下輸入以下兩行代碼,即可彈出畫板:
>>>import Color_palette_HSV
>>>Color_palette_HSV.color_palette_HSV()
效果圖如下:打開開關瓶蚂,滑動 H,S宣吱,V 三個滑條窃这,就可看到下方的顏色界面有明顯變化。如下圖所示(HSV為( 0征候, 255杭攻, 255)時,顏色為鮮紅色)疤坝,按下 ?‘ Esc ’ 鍵退出 :
當然這兩個只是小工具兆解,起到幫助作用,實際的顏色一般都需要試調跑揉。
這兩個小工具的代碼也比較簡單锅睛,我就不一一介紹埠巨。
以上都是我的拙見,如果有什么錯誤的地方或者改進的地方现拒,歡迎留言辣垒。
參考鏈接:http://www.pyimagesearch.com/2015/09/14/ball-tracking-with-opencv/
參考書籍:《opencv-python-tutroals》