OpenCV学习-P40 霍夫变换

OpenCV学习-P40 霍夫变换

  • 霍夫变换
  • 霍夫直线检测
  • 2 霍夫圆检测

霍夫变换

OpenCV学习-P40 霍夫变换_第1张图片
OpenCV学习-P40 霍夫变换_第2张图片
OpenCV学习-P40 霍夫变换_第3张图片
OpenCV学习-P40 霍夫变换_第4张图片
OpenCV学习-P40 霍夫变换_第5张图片

在笛卡尔坐标系下,直角坐标空间下的点对应霍夫空间中的直线,直角坐标中共线的两点对应霍夫空间中两条直线的交点,三个共线的点对应霍夫空间三条线的交点,所以,反过来说,霍夫空间两条直线的交点可以表示直角空间中共线的两点,即可以表示一条直线。但是遇到下图的三个点垂直组成x=2的这条直线,需要转换到极坐标系求解。

OpenCV学习-P40 霍夫变换_第6张图片
所以,只需要求得霍夫空间的交点位置,即可得到原坐标系(直角坐标系)下的直线
OpenCV学习-P40 霍夫变换_第7张图片
OpenCV学习-P40 霍夫变换_第8张图片

霍夫直线检测

OpenCV学习-P40 霍夫变换_第9张图片
OpenCV学习-P40 霍夫变换_第10张图片
霍夫直线检测过程:先对图像做canny类的边缘检测得到边缘所有的点,然后将这些点都转化为霍夫空间的曲线,然后再求霍夫空间中曲线相交最多的点。上方说的ρθ矩阵就是用来控制精度,如果想要检测所有角度的直线,那么θ为180;若想要精度达到像素级别,那么ρ需要和图像的对角线距离相等

img = cv.imread(r'.\\20220822162647.jpg',1)
gray=cv.cvtColor(img,cv.COLOR_BGR2RGB)
edges = cv.Canny(gray,50,150)
#2 霍夫变换直线检测
lines = cv2.HoughLines(edges,0.8,np.pi/180,150)
#3 将检测的线绘制在图像上
for line in lines:
    rho,theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0=a*rho
    y0=b*rho
    #将直线延长显示
    x1= int(x0 +1000*(-b))
    y1= int(y0 +1000*(a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))
    cv.line(img,(x1,y1),(x2,y2),(255,0,0))
plt.imshow(edges)
plt.imshow(img[:,:,::-1])
plt.show()

2 霍夫圆检测

OpenCV学习-P40 霍夫变换_第11张图片
OpenCV学习-P40 霍夫变换_第12张图片
OpenCV学习-P40 霍夫变换_第13张图片

你可能感兴趣的:(OpenCV笔记,opencv,学习,计算机视觉)