霍夫变换
霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、电脑视觉(computer vision)以及数位影像处理(digital image processing)。霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执行投票来决定物体的形状,而这是由累加空间(accumulator space)里的局部最大值(local maximum)来决定。
霍夫变换
1.标准霍夫变换-HoughLines()
2.累计概率霍夫变换-HoughLinesP()
3.霍夫圆变换-HoughCircles()
霍夫线变换是一种寻找直线的方法,首先将图像进行边缘检测处理,输入为边缘二值图。
OpenCV支持三种不同的霍夫线变换:
标准霍夫变换(SHT)------HoughLines()
多尺度霍夫变换(MSHT)------HoughLines()
累计概率霍夫变换(PPHT)------HoughLinesP()
HoughLines()函数参数详解:
void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0, double min_theta=0, double max_theta=CV_PI )
1、image – 8-bit, single-channel binary source image. The image may be modified by the function.
输入的图像应该是8为单通道二值图像
2、lines—Output vector of lines.
输出的直线,lines代表的是一个容器,包含(\rho, \theta)的容器
3、rho – distance resolution of the accumulator in pixels.
极径参数的距离分辨率
4、theta – Angle resolution of the accumulator in radians.
极角参数的角度分辨率
5、threshold – Accumulator threshold parameter. Only those lines are returned that get enough votes (>\texttt{threshold} ).
设定的阈值,大于此阈值的交点,才会被认为是一条直线
HoughLinesP()函数参数详解
void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, doubleminlineLength=0, double maxLineGap=0 )
1、image – 8-bit, single-channel binary source image. The image may be modified by the function.
输入的图像应该是8为单通道二值图像
2、lines – Output vector of lines.
输出的矢量。输出的两点是线段的两个端点
3、rho – Distance resolution of the accumulator in pixels.
极径参数的距离分辨率
4、theta – Angle resolution of the accumulator in radians.
极角参数的角度分辨率
5、threshold – Accumulator threshold parameter. Only those lines are returned that get enough votes (>\texttt{threshold} ).
设定的阈值,大于此阈值的交点,才会被认为是一条直线
6、minLineLength – Minimum line length. Line segments shorter than that are rejected.
线段的最小长度
7、maxLineGap – Maximum allowed gap between points on the same line to link them.
点到直线被允许的最大距离
HoughCircles()函数参数详解
void HoughCircles(InputArray image,OutputArray circles, int method, double dp, double minDist, double param1=100,double param2=100, int minRadius=0, int maxRadius=0 )
第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的灰度单通道图像。
第二个参数,InputArray类型的circles,经过调用HoughCircles函数后此参数存储了检测到的圆的输出矢量,每个矢量由包含了3个元素的浮点矢量(x, y, radius)表示。
第三个参数,int类型的method,即使用的检测方法,目前OpenCV中就霍夫梯度法一种可以使用,它的标识符为CV_HOUGH_GRADIENT,在此参数处填这个标识符即可。
第四个参数,double类型的dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。上述文字不好理解的话,来看例子吧。例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半那么大的宽度和高度。
第五个参数,double类型的minDist,为霍夫变换检测到的圆的圆心之间的最小距离,即让我们的算法能明显区分的两个不同圆之间的最小距离。这个参数如果太小的话,多个相邻的圆可能被错误地检测成了一个重合的圆。反之,这个参数设置太大的话,某些圆就不能被检测出来了。
第六个参数,double类型的param1,有默认值100。它是第三个参数method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。
第七个参数,double类型的param2,也有默认值100。它是第三个参数method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。
第八个参数,int类型的minRadius,有默认值0,表示圆半径的最小值。
第九个参数,int类型的maxRadius,也有默认值0,表示圆半径的最大值。需要注意的是,使用此函数可以很容易地检测出圆的圆心,但是它可能找不到合适的圆半径。
标准霍夫变换-HoughLines()
实例代码:
int main(int argc, char** argv)
{
Mat src = imread(“3.JPG”, CV_LOAD_IMAGE_color);
Mat dstImg = src.clone();
imshow(“src”, src);
//霍夫变换是一种寻找直线的方法,一般在使用霍夫变换前首先将图像进行边缘检测处理,一般霍夫变换的输入为边缘二值图
cvtColor(src, src, CV_BGR2GRAY);
Mat cannyImg;
Canny(src, cannyImg, 50, 200, 3);
imshow(“Canny”, cannyImg);
vector lines; //定义矢量结构lines用于存放得到的线段矢量(ρ,θ)集合
HoughLines(cannyImg, lines, 1, CV_PI / 180, 150);
for (size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0], theta = lines[i][1];
Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a rho, y0 = b rho;
pt1.x = cvRound(x0 + 1000 * (-b));
pt1.y = cvRound(y0 + 1000 * (a));
pt2.x = cvRound(x0 - 1000 * (-b));
pt2.y = cvRound(y0 - 1000 * (a));
line(dstImg, pt1, pt2, Scalar(0, 0, 255), 1, CV_AA);
}
imshow(“dst”, dstImg);
waitKey(0);
destroyAllwindows();
}
运行结果如下:
累计概率霍夫变换-HoughLinesP()
实例代码如下:
int main(int argc, char** argv)
{
Mat cannyImg;
Mat src = imread(“3.JPG”);
Mat dstImg = src.clone();
imshow(“src”, src);
cvtColor(src, src, CV_BGR2GRAY);
Canny(src, cannyImg, 50, 200, 3);
vector lines; //定义矢量结构lines用于存放得到的线段矢量(x_1,y_1,x_2,y_2)集合
HoughLinesP(cannyImg, lines, 1, CV_PI/180, 150, 50, 10);
//将线段画在目标图像上
for(size_t i = 0; i<lines.size(); i++)
{
Vec4i l = lines[i];
line(dstImg, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 255, 0), 2, CV_AA);
}
imshow(“dst”, dstImg);
waitKey(0);
destroyAllWindows();
}
运行结果如下:
霍夫圆变换-HoughCircles()
实例代码如下:
int main(int argc, char** argv)
{ ///霍夫圆变换-HoughCircles()
Mat src = imread(“1.JPG”);
Mat dst = src.clone();
imshow(“src”, src);
cvtColor(src, src, CV_BGR2GRAY);
GaussianBlur(src, src, Size(9, 9), 2, 2);//不滤波会有非常非常多的误检圆
vector circles;//存放经霍夫变换后检测出的圆的输出矢量(x,y,radius)
HoughCircles(src, circles, CV_HOUGH_GRADIENT, 2, 30, 200, 100, 10, 200);
//将圆画在目标图像上
for (size_t i = 0; i < circles.size(); i++)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
circle(dst, center, 3, Scalar(0, 0, 255), -1, 8, 0);
circle(dst, center, radius, Scalar(0, 255, 0), 3, 8, 0);
}
imshow(“dst”, dst);
waitKey(0);
}
运行结果如下:
相关阅读
一、霍夫直线变换: opencv对应的API函数: HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int
OpenCV:计时函数getTickCount、getTickFrequency
1. getTickCount() & getTickFrequency() getTickCount():返回CPU自某个时间以来走过的时钟周期数。getTickFrequency():返回CPU
SIFT在前面已经说过了,可以说在实现过程中是精益求精,用了各种手段来删除不符合条件的特征点,同时也得到了很好的效果但是实时性不
OpenCV中image.copyTo()有两种形式:1、image.copyTo(imageROI),作用是把image的内容粘贴到imageROI;2、image.copyTo(imageROI,mask),
在Mat矩阵类的成员函数中copyTo(roi , mask)函数是非常有用的一个函数,尤其是后面的mask可以实现蒙版的功能,我们用几个实例来说明