学习opencv之Hough变换
2013-05-23 21:38
363 查看
对于笛卡尔坐标系来说:y=ax+b,如果坐标上一点(x0,y0),则对应参数坐标(a0,b0),
同理,如果在笛卡尔坐标系上一条直线(即有恒定的参数(a,b))上的点,在参数坐标上则会在(a,b)这点上相交。
一般来说我们可以通过设置直线上点的阈值(或者说是个数)来定义多少条曲线交于一点,这样我们才认为检测到一条直线。
hough线变换要做的就是追踪图像中的每个点对应曲线间的交点,如果交于一点的曲线的数量超过了设定的阈值,就认为交点所
代表的参数对(a,b)在原图像中为一条直线。
在opencv中有两种hough变换:
1、标准hough线变换
它能给我们提供参数对的集合来表示检测到的直线 用函数HoughLines(),它能给我们提供一组参数对
的集合来表示检测到的直线
参数:
dst: 边缘检测的输出图像. 它应该是个灰度图 (但事实上是个二值化图)
lines: 储存着检测到的直线的参数对
的容器 * rho : 参数极径 以像素值为单位的分辨率. 我们使用 1 像素.
theta: 参数极角 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 要”检测” 一条直线所需最少的的曲线交点
2、统计概率hough线变换
它输出检测到的直线的端点(x0,y0,x1,y1) 用函数HoughLinesP(),她输出检测到的直线的端点
。
参数:
dst: 边缘检测的输出图像. 它应该是个灰度图 (但事实上是个二值化图) * lines: 储存着检测到的直线的参数对 的容器
rho : 参数极径 以像素值为单位的分辨率. 我们使用 1 像素.
theta: 参数极角 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 要”检测” 一条直线所需最少的的曲线交点 *
minLinLength: 能组成一条直线的最少点的数量. 点数量不足的直线将被抛弃.
maxLineGap: 能被认为在一条直线上的亮点的最大距离.
代码演示如下:
同理,如果在笛卡尔坐标系上一条直线(即有恒定的参数(a,b))上的点,在参数坐标上则会在(a,b)这点上相交。
一般来说我们可以通过设置直线上点的阈值(或者说是个数)来定义多少条曲线交于一点,这样我们才认为检测到一条直线。
hough线变换要做的就是追踪图像中的每个点对应曲线间的交点,如果交于一点的曲线的数量超过了设定的阈值,就认为交点所
代表的参数对(a,b)在原图像中为一条直线。
在opencv中有两种hough变换:
1、标准hough线变换
它能给我们提供参数对的集合来表示检测到的直线 用函数HoughLines(),它能给我们提供一组参数对
的集合来表示检测到的直线
参数:
dst: 边缘检测的输出图像. 它应该是个灰度图 (但事实上是个二值化图)
lines: 储存着检测到的直线的参数对
的容器 * rho : 参数极径 以像素值为单位的分辨率. 我们使用 1 像素.
theta: 参数极角 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 要”检测” 一条直线所需最少的的曲线交点
2、统计概率hough线变换
它输出检测到的直线的端点(x0,y0,x1,y1) 用函数HoughLinesP(),她输出检测到的直线的端点
。
参数:
dst: 边缘检测的输出图像. 它应该是个灰度图 (但事实上是个二值化图) * lines: 储存着检测到的直线的参数对 的容器
rho : 参数极径 以像素值为单位的分辨率. 我们使用 1 像素.
theta: 参数极角 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 要”检测” 一条直线所需最少的的曲线交点 *
minLinLength: 能组成一条直线的最少点的数量. 点数量不足的直线将被抛弃.
maxLineGap: 能被认为在一条直线上的亮点的最大距离.
代码演示如下:
// 1.1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include"opencv243.h" using namespace std; using namespace cv; void houghlines(Mat dst,Mat cdst) { vector<Vec2f> lines; HoughLines(dst,lines,1,CV_PI/180,200,0,0);//PI表示180度 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=rho*a, y0=rho*b; 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(cdst,pt1,pt2,Scalar(0,0,255),1,CV_AA); } } void houghlinesp(Mat dst,Mat cdst) { vector<Vec4i> lines; HoughLinesP(dst,lines,1,CV_PI/180,50,50,10); for(size_t i=0;i<lines.size();i++) { Vec4i L=lines[i]; line(cdst,Point(L[0],L[1]),Point(L[2],L[3]),Scalar(0,0,255),1,CV_AA); } } int _tmain(int argc, _TCHAR* argv[]) { Mat src=imread("C:\\Users\\sony\\Desktop\\shi.jpg",0); if(src.empty()) { cout<<"file erro !"<<endl; } Mat dst,cdst; Canny(src,dst,50,200,3); cvtColor(dst,cdst,CV_GRAY2BGR); houghlinesp(dst,cdst); imshow("source",dst); imshow("detected lines",cdst); waitKey(0); return 0; }
相关文章推荐
- OpenCV 学习(Hough 变换提取直线)
- OpenCV 学习(Hough 变换提取直线)
- python OpenCV学习笔记(二十七):Hough线变换
- OpenCV学习之Hough变换检测直线
- python OpenCV学习笔记(二十八):Hough圆变换
- OpenCV学习之基于Hough变换的直线检测
- OpenCV学习笔记9 (Hough线变换)
- Python OpenCV学习笔记之:hough变换检测圆形
- 【opencv的学习】各类变换的尝试
- 霍夫变换直线检测houghlines及opencv的实现分析
- kinect学习笔记四(距离变换 distance tranform 和opencv像素访问方式)
- Python下opencv使用笔记(十一)(详解hough变换检测直线与圆)
- Hough变换学习
- 【opencv学习之二十七】Hough霍夫变换寻找直线和圆
- opencv笔记(5):Hough变换
- OpenCV实践之路——Hough变换检测猫眼
- OpenCV学习——物体跟踪的粒子滤波算法实现之粒子集合变换
- OpenCV实现Hough变换检测圆形
- python opencv入门 Hough圆变换(28)
- hough椭圆变换——opencv