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
2、對感興趣域的比較統計
對于得到的U和V,Pixy將其作為“學習”的依據,即下面的學習算法均是依靠此處的U和V來進行的,在colorlut.cpp的calcRatios函數中,Pixy對于得到的U和V值進行了如下處理:其中sig是個結構體,其中的元素代表該感興趣前景的U和V的上下閾值
3、根據統計進行“學習”
由上部分得到的ratios數組表征了用戶給定區域的像素在該閾值左右的分布,假定給定一個該分布情況的界限,則閾值就可以根據當前分布與給定分布之間的大小進行自動調整(Pixy默認的界限是80%,即該閾值可以提取出圖像區域80%的像素值):以U值為例,當圖像在該閾值作用下,大于U閾值最小值的像素點有90%,則說明U閾值的最小值過小,此時應該向下調整,使該閾值增大,反之則反之。具體的代碼見下: 其中m_ratio為0.8
Opencv實現
其實知道了原理之后,想用Opencv對一幅圖像進行處理并得到較好的閾值是比較容易的,筆者也對該算法進行了嘗(chao)試(xi),但是效果十分不好,1、不能進行較好的前景提取;2、處理速度十分慢。對于以上兩個問題,個人認為還是對于YUV的格式沒有把握好,導致中間運算出現問題(悼念三分鐘嘗試失敗)。
但是筆者并沒有放棄,把該算法移植到了HSV空間上,說是移植,其實中間去掉了一些處理,比如移植的算法沒有考慮亮度對顏色的影響(> <),但是確實可以給定一個區域進行自“學習”了,收獲還是不小,想要進行參考的同學可以到該地址進行下載http://download.csdn.net/detail/wubaobao1993/9745837
最后上兩個圖,是該算法的實際效果
總結
以上是生活随笔為你收集整理的Pixy原理及Opencv实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大学计算机专业绩点在3.5算好,大学平均
- 下一篇: python地址转经纬度_经纬度地址转换