android系統中移動物體檢測步驟和方法
物體檢測的方法有很多,現在主流的方法有光流法、背景查分法、幀間差分法,它們各有各的優缺點;為了計算方便和同時能夠檢測
到多個物體,這裡使用的是背景差分法;
物體檢測的步驟大致可分為下面幾個部分:高斯濾波器->差值->二值化->邊緣檢測->逼近矩陣->顯示;
要在android系統上實現這些方法可以自己寫,但是用到的for迴圈或其他迴圈都會浪費很多的時間,從而不利於實時檢測;所以這裡是
使用了opencv3.0提供的庫函式來實現的。
1、高斯濾波器
Imgproc.GaussianBlur(background,background,new Size(5.0,5.0),1.5);
它的作用是用來使得輸入的影象變得更加平滑些,有利於減少檢測時引入的誤差;
2、差值
Core.absdiff(background,mGray,ss);
它的作用是將當前幀和背景幀矩陣相減然後取絕對值並存儲在ss矩陣中;
3、二值化
Imgproc.threshold(ss,ss, 40, 255, Imgproc.THRESH_BINARY);
4、邊緣檢測
Imgproc.findContours(ss, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE);
5、逼近矩陣
最近一直有人問我,怎麼將檢測的無邊邊緣逼近成一個方形或其它形狀,其實這個問題很容易,你只要在物體的邊緣上得到
你要繪製的形狀的必要點即可,這裡以方形為例:如果要自己寫的話,你可能要遍歷物體邊緣找到物體的左上角、左下角、右
上角、右下角,然後在進行一定的優化,使得繪製出的方形不會將物體覆蓋,這樣想想就知道會產生多大的複雜度;這裡我們可
以用opencv提供的類Imgproc來解決這一問題,具體程式碼可以參考如下:
Rect r = Imgproc.boundingRect(border);
其中,border是檢測到的物體的邊緣,這樣就會將得到的四個點放在方形類Rect中;接著,通過opencv的繪圖函式在圖片中將
圖形繪製出來:
Imgproc.rectangle(rGba,r.tl(),r.br(),new Scalar(20.0,255.0),2);
其中,rGba是要繪製的影象,r.tl()為左上角座標,r.br()為右下角座標,2為邊框線的粗細。
綜上,你就能夠通過手機或其它帶有攝像頭的裝置輕鬆檢測到並追蹤運動物體了。
作者原著,如需轉載請註明出處,謝謝。