以下内容摘自《OpenCV2计算机视觉编程手册》
引言
本章主要介绍了一种更优秀的检测轮廓的方法:Canny算子,如何使用霍夫变换检测直线、圆等形状,直线拟合,提取轮廓,计算连通区域形状描述符。
使用Canny算子检测轮廓
在前面我们已经使用过很多种方法检测图像的轮廓,前面的算法最后生成的二值轮廓图主要的问题在于二值化的过程中,如果阈值选的过低,则会检测出很多不重要的边缘,并且检测到的轮廓也过宽,不利于精确定位物体,如果阈值过高,则有可能忽略重要的边缘,使用Canny算法即可以很好的解决这个问题。
基本原理:算法基于Sobel算子,使用两个阈值,一个低阈值和一个高阈值对边缘进行筛选,低阈值的大小要能够识别出那些明显是图像轮廓的像素,高阈值要保证能够识别出我们需要的、重要的轮廓,并且排出异常值,算法会分别使用两个阈值生成两幅图片,然后,将两幅图片生成一幅最优的轮廓图,只要指定合适的阈值,那么就能够生成高质量的轮廓。
用法:
cv::Mat contours;
cv::Canny(image,contours,125,350);
正常情况下,输出的图片中轮廓是用非零像素表示的,为了方便显示我们将其翻转黑白值代码如下:
cv::Mat contoursInv;
cv::threshod(contours,contoursInv,128,255,cv::THRESH_BINARY_INV);
使用霍夫变换检测直线
使用Canny算法得到图像的轮廓以后,如果我们想检测轮廓中的直线就可以使用这种方法。
基本原理:
对于一个图像来说,以左上角为原点,图像中的直线可以定义为下式:
ρ = x c o s θ + y s i n θ \rho=xcos\theta+ysin\theta