OpenCV学习(27) 直方图(4)
????? 我們可以利用OpenCV的直方圖,backproject直方圖和meanshift算法來跟蹤物體。下面通過簡單的例子來說明如何實現(xiàn)跟蹤算法,我們有兩幅狒狒的圖片,如下圖所示:我們首先在左圖中框選狒狒的臉,計算出框選區(qū)域的色度(HSV空間的H)直方圖,然后在image2中,backproject該直方圖,得到每個像素點屬于該直方圖的概率圖。
?
????? 得到的概率圖之后,我們?nèi)サ魣D中低飽和度的像素,然后二值化,最后對該圖使用meanshift算法,得到密度最大的區(qū)域,這個區(qū)域就是我們跟蹤的目標(biāo)區(qū)域。
注意下面去掉低飽和度像素的方法(HSV空間中的S分量表示飽和度):
cv::cvtColor(image, hsv, CV_BGR2HSV);
// 按通道分成3副圖像
cv::split(hsv,v);
// 標(biāo)示低飽和度的像素
cv::threshold(v[1],v[1],minSat,255,cv::THRESH_BINARY);
// 得到色度back-projection
result= finder.find(hsv,0.0f,180.0f,ch,1);
// 減少低飽和度像素
cv::bitwise_and(result,v[1],result);
?
???? meanshift算法的代碼如下,TermCriteria為迭代中值條件,最大迭代次數(shù)10,迭代精度0.01,只有這兩個條件都滿足的時候,迭代才會結(jié)束。迭代結(jié)束后,rect中存儲的就是目標(biāo)區(qū)域的位置。
??? cv::Rect rect(110,260,35,40);
??? cv::rectangle(image, rect, cv::Scalar(0,0,255));
? ? cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER,10,0.01);
??? cv::meanShift(result,rect,criteria);
??? cv::rectangle(image, rect, cv::Scalar(255,0,0));
?
程序代碼:工程FirstOpenCV22
總結(jié)
以上是生活随笔為你收集整理的OpenCV学习(27) 直方图(4)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 主流虚拟化产品对比列表01
- 下一篇: C#将Json字符串反序列化成List对