1. 程式人生 > >opencv輪廓檢測之 drawContours 函式 使用樣例

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等)