STM32驅動OV7725攝像頭顏色識別

2022-08-24 05:42:07 字數 3026 閱讀 7569

實驗目的:

使用stm32驅動ov7725攝像頭進行影象實時採集,在tft螢幕上實時顯示並識別影象中的特定顏色,在顏色的周圍畫上框。

實驗現象:

實現原理:

將攝像頭的資料讀出寫入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的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的反算就完成了。

推薦使用windos自帶的繪圖工具軟體中,點「顏色」->」編輯顏色」->」規定自定義顏色」 進入調色盤進行調色。

具體**請參考我上傳的工程**。

基於stm32和ov7725的智慧型循跡車

基於stm32f103zet6的智慧型循跡車。in1in2控制乙個輪子,in3in4控制另外乙個。這裡使用的是直流電機,控制如下 為了使用pwm進行調速,一定要記得用跳帽使調速度端為高電平。這樣,輸入不同占空比的pwm波就可以實現調速了。2.連線方式 連線時一定要注意的一點就是一定要保證l298n與...

基於STM32f103野火的OV7725攝像頭驅動

這周組長接了個畢設的活交給我們做,模組大體上是用了ov7725 超聲波 蜂鳴器報警 按鍵 lcd led。一 簡介 流程圖如下 在這個專案中我主要負責攝像頭模組,攝像頭的配置和顯示。先對攝像頭進行一下介紹 1 這次專案用的是ov7725,該攝像頭主要由鏡頭 影象感測器 板載電路 fifo 快取及下方...

對於攝像頭程式的時序優化(ov7725)

想法產生 我想寫一寫自己對調攝像頭時的的一點小心得,剛開始調攝像頭時候,就對pit定時和攝像頭的場中斷了解的不太清楚,似乎發現有問題但不知道是什麼。比如把處理影象的程式是放在主函式裡好呢,還是放在 pit中好呢,場中斷和 pit讓誰的優先順序更高一點好呢,場中斷時間和我自己程式執行的時間都是多少呢?...