Pixy原理及Opencv實現

2021-07-26 12:21:45 字數 2006 閱讀 3537

pixy的基本思想其實是簡單的:利用顏色空間來除去所有使用者不感興趣的背景,提取出前景。但是在實際的環境下卻並不好做,特別是攝像頭看到的顏色會受到光線的影響,導致顏色的變化(對於這一點,筆者覺得確實是沒有辦法的,比如紅色在黑暗的條件下確實看起來是紅色,那麼依靠任何顏色空間看到的其實都是黑色,無法區別),因此,對於pixy這樣神奇的產品來講,他的識別也需要顏色盡量鮮豔,飽和度盡量好的物體,對於背景來講,也盡量是光線較好、不突變的環境。否則pixy是「學習」不來的。

1、對畫素點的處理

pixy接收到攝像頭的資訊格式應該是yuv格式的,在原始碼的colorlut.cpp的nexthelper函式中,pixy做了兩件事:1、將yuv轉為rgb的;2、處理該畫素值得到u和v的值,這裡的u和v並不是yuv中的uv通道,而是經過了處理,具體處理的**如下:其中cl_lut_entry_scale變數為15

if (uv)

u = ((r-g1)<

c = r+g2+b;

if (c

v = ((b-g2)<

uv->m_u = u;

uv->m_v = v;

}

這樣做的好處是在u和v的值中,加入亮度的影響,這樣得到的u和v值就考慮到了光線亮度對於物體顏色的影響。
2、對感興趣域的比較統計對於得到的u和v,pixy將其作為「學習」的依據,即下面的學習演算法均是依靠此處的u和v來進行的,在colorlut.cpp的calcratios函式中,pixy對於得到的u和v值進行了如下處理:其中sig是個結構體,其中的元素代表該感興趣前景的u和v的上下閾值

while(ip->next(&uv))

// calc ratios

ratios[0] = (float)counts[0]/n;

ratios[1] = (float)counts[1]/n;

ratios[2] = (float)counts[2]/n;

ratios[3] = (float)counts[3]/n;

// calc mean (because it's cheap to do it here)

sig->m_umean = (sig->m_umin + sig->m_umax)/2;

sig->m_vmean = (sig->m_vmin + sig->m_vmax)/2;

在上段**中,pixy對使用者給出區域的畫素點與上下閾值進行比較統計,得到的統計值決定了「學習」的方向。
3、根據統計進行「學習」由上部分得到的ratios陣列表徵了使用者給定區域的畫素在該閾值左右的分布,假定給定乙個該分布情況的界限,則閾值就可以根據當前分布與給定分布之間的大小進行自動調整(pixy預設的界限是80%,即該閾值可以提取出影象區域80%的畫素值):以u值為例,當影象在該閾值作用下,大於u閾值最小值的畫素點有90%,則說明u閾值的最小值過小,此時應該向下調整,使該閾值增大,反之則反之。具體的**見下: 其中m_ratio為0.8

for (scale=1

<<30, sig->m_umin=sig->m_umax=sig->m_vmin=sig->m_vmax=0; scale!=0; scale>>=1)

根據上述**可以看到,pixy在學習的過程中對一幅影象(使用者感興趣)學習了30次,最終根據反饋得到了較好的閾值。
其實知道了原理之後,想用opencv對一幅影象進行處理並得到較好的閾值是比較容易的,筆者也對該演算法進行了嘗(chao)試(xi),但是效果十分不好,1、不能進行較好的前景提取;2、處理速度十分慢。對於以上兩個問題,個人認為還是對於yuv的格式沒有把握好,導致中間運算出現問題(悼念三分鐘嘗試失敗)。

最後上兩個圖,是該演算法的實際效果

Sobel運算元原理及OpenCv實現

索貝爾運算元 sobeloperator 主要用於獲得數字影象的一階梯度,常見的應用和物理意義是邊緣檢測。在技術上,它是乙個離散的一階 差分運算元,用來計算影象亮度函式的一階梯度之近似值,用來運算影象亮度函式的灰度值近似值。在影象的任何一點使用此運算元,將會產生該點對應的梯度向量或是其法向量。一 s...

霍夫變換原理及OpenCV實現

霍夫變換 hough transform 是影象處理中的一種特徵提取技術,它通過一種投票演算法檢測具有特定形狀的物體。該過程在乙個引數空間中通過計算累計結果的區域性最大值得到乙個符合該特定形狀的集合作為霍夫變換結果。霍夫變換於1962年由paul hough 首次提出 53 後於1972年由rich...

k means演算法及opencv實現

k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演算法之一。k means演算法的基本思想是 以空間中k個點為中心進行聚類,對最靠近他們的物件歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。假設要把樣本集分為c個類別,演算法描述如下 1 適當選擇c個類的初...