社区
C++ 语言
帖子详情
opencv直线相交检测
zymous
2015-05-29 10:27:45
小白求问怎么把两个白色圆圈和蓝色大圆环之间连接的金黄色铜丝提取出来,并检测出相交。我现在提取出来的如图所示,想利用hough直线检测但是检测不出来,有没有高手能够帮帮
...全文
489
2
打赏
收藏
opencv直线相交检测
小白求问怎么把两个白色圆圈和蓝色大圆环之间连接的金黄色铜丝提取出来,并检测出相交。我现在提取出来的如图所示,想利用hough直线检测但是检测不出来,有没有高手能够帮帮
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zymous
2015-05-29
打赏
举报
回复
无从下手,求给个思路
赵4老师
2015-05-29
打赏
举报
回复
个人意见:没必要用hough直线检测,用腐蚀、膨胀、轮廓提取就够了。 《学习OpenCV(中文版)》 编译链接调试OpenCV自带的相关例子程序。
OpenCV
霍夫变换(Hough Transform)
直线
检测
详解
霍夫变换(Hough Transform)的主要思想: 一条
直线
在平面直角坐标系(x-y)中可以用y=ax+b式表示,对于
直线
上一个确定的点(x0,y0),总符合y0-ax0=b,而它可以表示为参数平面坐标系(a-b)中的一条
直线
。因此,图像中的一个点对应参数平面的一条
直线
,同样,图像中的一条
直线
对应参数平面上的一个点。 基本Hough变换
检测
直线
: 由于同一条
直线
上的不同点在参数平面中是会经过同一个点的多条线。对图像的所有点作霍夫变换,
检测
直线
就意味着找到对应参数平面中的
直线
相交
最多的点。对这些交点做票数累计,然后取出票数大于最小投票数的点,即为原坐标系里
检测
出的
直线
。 一般,
直线
的参数
OpenCV
利用霍夫变换进行
直线
检测
本文实例为大家分享了
OpenCV
利用霍夫变换进行
直线
检测
的具体代码,供大家参考,具体内容如下 1.最简单的霍夫变换是在图像中识别
直线
。在平面直角坐标系(x-y)中,一条
直线
可以用下式表示:y=kx+b。 这表示参数平面(k-b)中的一条
直线
。因此,图像中的一个点对应参数平面中的一条
直线
,图像中的一条
直线
对应参数平面中的一个点。对图像上所有的点作霍夫变换,最终所要
检测
的
直线
对应的一定是参数平面中
直线
相交
最多的那个点。这样就在图像中
检测
出了
直线
。在实际应用中,
直线
通常采用参数方程:p=x\cos\theta+y\sin\theta。
Opencv
里有以下函数
检测
直线
(最基本的霍夫变换): vo
opencv
c++ 用
直线
拟合一组点代码
opencv
c++ 用
直线
拟合一组点,获取
直线
的位置和方向的精确估计,解决
直线
拟合的问题。思想:用HoughlinesP
检测
直线
,将
直线
保存在lines中,获取Canny图像并获取lines与canny图
相交
的点集,再用点集拟合
直线
代码
第十一节 图像处理之霍夫
检测
直线
import cv2 as cv import numpy as np #
直线
检测
#使用霍夫
直线
变换做
直线
检测
,前提条件:边缘
检测
已经完成 #标准霍夫线变换 def line_detection(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) edges = cv.Canny(gray, 50, 150) #apertureSize参数默认其实就是3 cv.imshow("edges", edges) #cv.HoughLines参数设置:参数1,灰度图像;参数二,以像素为单位的距离精度(一般都是1,进度高,但是速度会慢一点) #参数三,以弧度为单位的角度精度(一般是1rad);参数四,阈值,大于阈值threshold的线段才可以被
检测
通过并返回到结果中 #该函数返回值为rho与theta lines = cv.HoughLines(edges, 1, np.pi/180, 200) for line in lines: rho, theta = line[0] #line[0]存储的是点到
直线
的极径和极角,其中极角是弧度表示的。 a = np.cos(theta) #theta是弧度 b = np.sin(theta) x0 = a * rho #代表x = r * cos(theta) y0 = b * rho #代表y = r * sin(theta) x1 = int(x0 + 1000 * (-b)) #计算
直线
起点横坐标 y1 = int(y0 + 1000 * a) #计算起始起点纵坐标 x2 = int(x0 - 1000 * (-b)) #计算
直线
终点横坐标 y2 = int(y0 - 1000 * a) #计算
直线
终点纵坐标 注:这里的数值1000给出了画出的线段长度范围大小,数值越小,画出的线段越短,数值越大,画出的线段越长 cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) #点的坐标必须是元组,不能是列表。 cv.imshow("image-lines", image) #统计概率霍夫线变换 def line_detect_possible_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) edges = cv.Canny(gray, 50, 150, apertureSize=3) # apertureSize参数默认其实就是3 lines = cv.HoughLinesP(edges, 1, np.pi / 180, 60, minLineLength=60, maxLineGap=5) for line in lines: x1, y1, x2, y2 = line[0] cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) cv.imshow("line_detect_possible_demo",image) src = cv.imread("E:/
opencv
/picture/track.jpg") print(src.shape) cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) cv.imshow('input_image', src) line_detection(src) src = cv.imread("E:/
opencv
/picture/track.jpg") #调用上一个函数后,会把传入的src数组改变,所以调用下一个函数时,要重新读取图片 line_detect_possible_demo(src) cv.waitKey(0) cv.destroyAllWindows() 霍夫
检测
直线
原理: 关于hough变换,核心以及难点就是关于就是有原始空间到参数空间的变换上。以
直线
检测
为例,假设有一条
直线
L,原点到该
直线
的垂直距离为p,垂线与x轴夹角为θθ,那么这条
直线
是唯一的,且
直线
的方程为 ρ=xcosθ+ysinθρ=xcosθ+ysinθ, 如下图所
OpenCV
之
直线
检测
通过这样的变换方式就实现了避免了原空间中那条没有k的
直线
的寻找,通过这样的方式我们就能够找到在原空间中被一条
直线
所经过的所有的点,也就是通过我们的方式找到了原空间中的
直线
,这种方式我们可以在参数空间中通过寻找某个点被通过的次数来去寻找原空间中这条
直线
一共经过了多少个点,例如,要求在原空间中只有通过了50个点的
直线
才
检测
出来,那么在参数空间中就找到一个像素点,这个点被经过了50次,这样我们就可以通过这样的参数去寻找不同的条件的
直线
,进而去寻找更加精确的
直线
。1、
检测
直线
的霍夫变换原理。
C++ 语言
64,643
社区成员
250,478
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章