opencv輪廓檢測之 drawContours 函式 使用樣例
最近在寫車牌檢測的程式, 想法是想把車牌框的邊緣提取出來
但是經過二值化後的edge, 並不是完整的連線, 不少的地方有斷點, 還有無關的邊緣
先不考慮形態學, 看看是否能夠較好的提取處來
首先先上關於findContours的內容 http://blog.csdn.net/traumland/article/details/51093262
即使不看演算法只看看這兩張圖, findContours 中的 hierarchy 結構想必也能瞭解了
opencv官方文件中給了一個樣例, 就是利用drawContours 把 connected - components 都提取出來
cv::findContours(img,outerline,hierarchy,CV_RETR_TREE,CV_CHAIN_APPROX_NONE);
intidx=0;
for(;idx>=0;idx=hierarchy[idx][0]){
cv::Scalarcolor(rand()&255,rand()&255,rand()&255);
cv::drawContours(imgEmpty,outerline,idx,color,CV_FILLED,8,hierarchy);
}
原圖 效果圖 , 其中灰度圖用了canny處理
改動cv::findContours(img,outerline,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
關於CV_RETR_EXTERNAL,CV_RETR_TREE,CV_RETR_LIST,CV_RETR_CCOMP
請看 http://blog.csdn.net/traumland/article/details/51093262
個人認為
我們並不明確一個車牌需要多少條輪廓來構成, 而這些外部輪廓是同級的
所以想通過drawContours直接畫出邊界是不可能的,
需要其他方法, 比如形態學.影象邊緣是細化過的,所以只能先膨脹後腐蝕,也就是閉操作,
且膨脹不能使車牌邊框觸到影象邊界.
然後再進行開操作,去除某些細枝.
如圖, 是7*1 的閉操作這個結構元素的大小對於我來說不太好確定, 有必要將影象放置在一個較大尺寸的空白區域內.
那麼, 如何將某影象img放到某影象src的指定位置呢?
cv::Mat imgroi(src,rect);
img.copyTo(imgroi);
其中rect為cv::Rect, 需要一個左上角的頂點cv::Point(x,y), 一個width 一個height
我用20*20的先閉後開操作得到的結果如下, 白色與原邊框幾乎完全相等
除了形態學還有什麼方法?
填充法(種子區域生長法,floodfill等)