opencv轮廓检测之 drawContours 函数 使用样例

来源:互联网 发布:艾瑞数据报告 编辑:程序博客网 时间:2024/05/16 07:18

最近在写车牌检测的程序, 想法是想把车牌框的边缘提取出来

但是经过二值化后的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);
    int idx = 0;
    for( ; idx >= 0; idx = hierarchy[idx][0] ){
        cv::Scalar color( 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等)



0 0
原创粉丝点击