计算机视觉 OpenCV Android | 基本特征检测之 霍夫直线检测 详析

计算机视觉 OpenCV Android | 基本特征检测之 霍夫直线检测 详析,第1张

假设有一条直线如下图:

在 笛卡儿平面坐标系 统中的斜率参数与截距参数为 (k,b) ;

对于 每个升码带平面空间的像素点坐标(x,y) ,

随着 角度θ 的取值不同,模凯都会 得到r值 ,

(%+++%要点.B)而对于 任意一条直线 来说,在 极坐标空间 它的 (r,θ) 都是 固定不变的 ,

则对于 边缘图像 的 每个平面空间坐标点 可绘制 极坐标的曲线 如图所示:

OpenCV关于 霍夫直线变换 提供了两个相关API函数,

一个 是在霍夫空间求取 直线两个极坐标的参数 ,

需要开发者自己转换到平面坐标空间计算直线;

另外 一个则会 直接返回平面空间直线/线段的两个点坐标信息 。

返回极坐标参数的API函数如下:

使用该API实现直线检测:

以上的这个API函数需要对得到的每对 极坐标参数(r,θ) 做 计算 ,

使其 变换 到 平面空间 ( x0 = r * cosθ y0 = r * sinθ ),

接着通过对 x0 和 y0 添加 偏移量 并吵芦进行计算,得到直线的 两个点 ;

然后 绘制直线 。

另外一个 API函数则比较简单,

它 省去了 开发者自己把极坐标变换为直线坐标的 过程 ,

直接返回 每个线段/直线对应的 两个点坐标 ,

其API函数与参数的解释具体如下:

使用该API实现图像直线检测:

你可真有分,上次的既然我没有解释清楚怎么不继续追问?

问清楚再给分啊。

根据你这个图我觉得用霍夫检测直线效果不好,晚上给你仔细看看。

加了if 之后就是腊坦把斜率限定在了10-30度这个范围。

由于你这个小斜线的斜率目测是这个范围,没有检测出来可能有如下两个原因:

1 你要检测的部分斜率不是10-30度

2 由于曲线不够直,导致检稿裤测的不是一条直线,而是很多零碎的线段。

测试方法:

通过绘制不同颜色的线段来观察是键局简否是检测到得一条线段(还是很多线段连接成的一条曲线)

通过对 三个通道加不同的颜色来绘制。

uchar R=(rand() % 205) +50

uchar G=(rand() % 205) +50

uchar B=(rand() % 205) +50

(产生从50-255的随机数)

修改后代买

lines = cvHoughLines2 (cannyImg, storage, CV_HOUGH_PROBABILISTIC,1,CV_PI/180, 10, 5, 10)

for (int i = 0i <lines->totali++){

CvPoint* line = (CvPoint*)cvGetSeqElem (lines, i)

double slope = ((double)(line[0].y - line[1].y))/((double)(line[0].x - line[1].x)) //斜率

if(atan(slope) >10 &&atan(slope) <30){ //要在10-30度之间的直线

uchar R=(rand() % 205) +50

uchar G=(rand() % 205) +50

uchar B=(rand() % 205) +50

cvLine (pImgDst, line[0], line[1], CV_RGB(R,G,B),2,8) //画出红色直线

}

}

结束之后贴结果,我给你继续解答


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12335346.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存