日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pixy原理及Opencv实现

發布時間:2024/1/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pixy原理及Opencv实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Pixy原理

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

在筆者看到的Pixy的對于顏色處理的源碼中,其核心思想有2個部分,這也是筆者借鑒最多的地方:

1、對像素點的處理
Pixy接收到攝像頭的信息格式應該是YUV格式的,在源碼的colorlut.cpp的nextHelper函數中,Pixy做了兩件事:1、將YUV轉為RGB的;2、處理該像素值得到U和V的值,這里的U和V并不是YUV中的UV通道,而是經過了處理,具體處理的代碼如下:其中CL_LUT_ENTRY_SCALE變量為15

if (uv){c = r+g1+b;if (c<miny){m_x += 2;continue;}u = ((r-g1)<<CL_LUT_ENTRY_SCALE)/c;c = r+g2+b;if (c<miny){m_x += 2;continue;}v = ((b-g2)<<CL_LUT_ENTRY_SCALE)/c;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)){if (uv.m_u>sig->m_uMin)counts[0]++;if (uv.m_u<sig->m_uMax)counts[1]++;if (uv.m_v>sig->m_vMin)counts[2]++;if (uv.m_v<sig->m_vMax)counts[3]++;n++;}// calc ratiosratios[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){calcRatios(ip, sig, ratios);if (ratios[0]>m_ratio)sig->m_uMin += scale;elsesig->m_uMin -= scale;if (ratios[1]>m_ratio)sig->m_uMax -= scale;elsesig->m_uMax += scale;if (ratios[2]>m_ratio)sig->m_vMin += scale;elsesig->m_vMin -= scale;if (ratios[3]>m_ratio)sig->m_vMax -= scale;elsesig->m_vMax += scale;} 根據上述代碼可以看到,Pixy在學習的過程中對一幅圖像(用戶感興趣)學習了30次,最終根據反饋得到了較好的閾值。

Opencv實現

其實知道了原理之后,想用Opencv對一幅圖像進行處理并得到較好的閾值是比較容易的,筆者也對該算法進行了嘗(chao)試(xi),但是效果十分不好,1、不能進行較好的前景提取;2、處理速度十分慢。對于以上兩個問題,個人認為還是對于YUV的格式沒有把握好,導致中間運算出現問題(悼念三分鐘嘗試失敗)。

但是筆者并沒有放棄,把該算法移植到了HSV空間上,說是移植,其實中間去掉了一些處理,比如移植的算法沒有考慮亮度對顏色的影響(> <),但是確實可以給定一個區域進行自“學習”了,收獲還是不小,想要進行參考的同學可以到該地址進行下載http://download.csdn.net/detail/wubaobao1993/9745837

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

總結

以上是生活随笔為你收集整理的Pixy原理及Opencv实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。