實驗目的: 使用stm32驅動OV7725攝像頭進行圖像實時采集,在tft屏幕上實時顯示并識別圖像中的特定顏色,在顏色的周圍畫上框。
實驗現象:
我的工程代碼鏈接: http://download.csdn.net/my
程序移植自阿莫論壇某位大神的程序。 鏈接:http://www.amobbs.com/thread-5499408-1-1.html?_dsign=85056954
實現原理: 將攝像頭的數據讀出寫入tft屏,讀取tft屏幕上的像素點的顏色進行識別。由于RGB格式的顏色數據的效果不好,所以將其轉換為HSL格式數據。首先遍歷尋找腐蝕中心,然后在之前腐蝕中心點處進行迭代向外尋找新的腐蝕中心。腐蝕算法從該點開始分別向上下左右四個方向進行讀點,若點的顏色符合條件則往外讀,等四個方向都結束后得到四個邊緣點的坐標,記左邊緣點的x軸坐標為left,右邊緣點的x軸坐標為right,上邊緣點的y軸坐標為up,下邊緣點的y軸坐標為bottom,那么坐標( (right-left)/2 , (up-bottom)/2 ) 即為新的腐蝕中心。
關于程序中使用到的參數值,我是參照下面這些該大神在論壇說的調試經驗得到的參數: 設置好H、S、L的閾值,用起來沒有問題。分享一下我的調節參數時總結的技巧: 1.識別綠色和藍色的效果最好,因為他們在色調譜中占據的范圍最大 2.先將S、L的范圍設的廣一些(如 5 -250 ),先調節H的值的范圍 3.H值調節好后,再調節S、L值
這里介紹下一些相關概念: HSL:(摘自百度百科)
HSL的H(hue)分量,代表的是人眼所能感知的顏色范圍,這些顏色分布在一個平面的色相環上,取值范圍是0°到360°的圓心角,每個角度可以代表一種顏色。基本參照:360°/0°紅、60°黃、120°綠、180°青、240°藍、300°洋紅,它們在色相環上按照60°圓心角的間隔排列。 HSL的S(saturation)分量,指的是色彩的飽和度,它用0%至100%的值描述了相同色相、明度下色彩純度的變化。數值越大,顏色中的灰色越少,顏色越鮮艷,呈現一種從理性(灰度)到感性(純色)的變化。 HSL的L(lightness)分量,指的是色彩的明度,作用是控制色彩的明暗變化。它同樣使用了0%至100%的取值范圍。數值越小,色彩越暗,越接近于黑色;數值越大,色彩越亮,越接近于白色。
HSL與RGB之間的計算: 從RGB推算HSL: R、G、B的數值定在【0,255】 亮度L只依賴于R、G、B的最大值和最小值。若令M、N分別是R、G、B的最大值和最小值,則有:若M=0(N=0),即R、G、B均為0時,L=0;否則,亮度L為 其中。由公式可知,L的取值范圍在0到240之間。 對于飽和度S:當M或N改變時S隨之改變;否則,S不變。即S與L的情況類似,只與最大和最小值有關,換句話說與L有關。所以可以得到S與L之間的數學關系: 當M=N=0或者M=N=255時,沒有意義;l=0時,s=0; 當(M+N)>256時,S為:S=240(M-N)/(512-M-N);當l>120時,s = (M-N)* 240 / ( 480 - ( M+ N) ); 當(M+N)<256時,S為:S=240(M-N)/(M+N);當l<=120時,s = (M-N)* 240 / ( M+ N); 同理,色相H也是只與最大值和最小值有關。 當M=N時,H無定義; 當最大值為紅色,最小值為藍色,即M=R、N=B,H介于0到40之間,有: H=40(G-N)/(M-N); 當最大值為紅色,最小值為綠色,即M=R、N=G,H介于200到240之間,有: H=240+40(G-B)/(M-N); 當最大值為綠色,最小值為紅色,即M=G、N=R,H介于80到120之間; 當最大值為綠色,最小值為藍色,即M=G、N=B,H介于40到80之間; h = 40 * ( B - R ) / (M-N)+ 80; 當最大值為藍色,最小值為紅色,即M=B、N=R,H介于120到160之間; 當最大值為藍色,最小值為綠色,即M=B、N=G,H介于160到200之間; h = 40 * ( R - G ) / (M-N)+ 160;
從HSL反算RGB: 當H無定義時,表示R、G、B三者相等,因策,他們的值可以直接由下面公式求得: 當L=0時,R=G=B=0; 當L!=0時,R=G=B=(17L-8)/16; 當H有定義時,令SUM為M與N之和,由上面的公式可知,若L=0,則SUM=0,否則SUM=(17L-8)*2/16。 若SUM<256,則最大值M為:M=SUM/2+SUM*S/480; 若SUM<=256,則最大值M為:M=SUM/2+(512-SUM)*S/480; 求出最大值后,可以求出最小值N=SUM-M。 下面分六種情況求出R、G、B的值: 令L為H/40的整數部分: 若L=0,則: R=M B=N G=B+H *(R-B)/40 若L=1,則: G=M B=N R=G+(G-B)(H-40)/40 若L=2,則: G=M R=N B=R+(G-R)(H-80)/40 若L=3,則: B=M R=N G=B+(B-R)(H-120)/40 若L=4,則: G=N B=M R=G+(B-G)(H-160)/40 若L=5,則: R=M G=N B=R +(R-G)(H-200)/40 至此RGB的反算就完成了。
如果想要更快捷地將HSL轉換成RGB格式,可以使用下面的工具: 網絡工具鏈接: HSL取色器 鏈接: http://hslpicker.com/#f9aee5,0.82 RGB、HEX、HSL等顏色形式相互轉換工具 鏈接: http://tools.jb51.net/color/rgb_hex_hsl
推薦使用windos自帶的繪圖工具軟件中,點“顏色”->”編輯顏色”->”規定自定義顏色” 進入調色板進行調色。
具體代碼請參考我上傳的工程代碼。
參考鏈接: 楊朝霞,逯峰,圖像處理中RGB與HLS之間的轉換,http://www.doc88.com/p-9991476681520.html
新聞熱點
疑難解答