7.1霍夫变换应用技术
实现结果:
对变化的线条检测:
import cv2 import numpy import numpy as np import math def getMask(img): mask=numpy.zeros_like(img) ignore_mask_color=255 imshape=img.shape vertices = np.array([[(0, imshape[0]),(5,697),(5,400), (450, 230), (520, 230),(974,420),(974,697), (imshape[1], imshape[0])]], dtype=np.int32) cv2.fillPoly(mask,vertices,ignore_mask_color) # 位乘法 mask_img = cv2.bitwise_and(img, mask) return mask_img def baseHufu(): img=cv2.imread("./image/chedao.jpg") #灰度化 gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #滤波 kernel_size=5 blur_gary=cv2.GaussianBlur(gray,(kernel_size,kernel_size),0) #边缘检测 edges=cv2.Canny(blur_gary,50,200,3) #遮罩 mask_img=getMask(edges) #使用霍夫检测直线 minlin = 10 maxlen = 20 maxLineGap=10 lines=cv2.HoughLinesP(mask_img,3,np.pi/180,80,minlin,maxlen,maxLineGap) for l in lines: x1,y1,x2,y2=l[0] cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2) #计算角度 def hF(): img = cv2.imread("./image/huofu1.png") #灰度化 gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #滤波 kernel_size = 5 blur_gary = cv2.GaussianBlur(gray, (kernel_size, kernel_size), 0) #二值化 ret,thresh=cv2.threshold(blur_gary,100,255,cv2.THRESH_BINARY) #霍夫变换 minlin = 20 maxlen = 20 maxLineGap = 40 lines=cv2.HoughLinesP(thresh,2,np.pi/180,minlin,maxlen,maxLineGap) for l in lines: x1,y1,x2,y2=l[0] cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2) theta=(y2-y1)/(x2-x1) #弧度 angle=math.atan(theta) #角度 angle=angle*(180/np.pi) print(angle) # cv2.imshow("blur_gray",blur_gary) # cv2.imshow("edges", edges) # cv2.imshow("mask", mask_img) cv2.imshow("thrsh", thresh) cv2.imshow("hu",gray) cv2.imshow("img", img) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ == '__main__': # baseHufu() hF()
解析:
-
导入模块:
import cv2
:导入opencv
库,用于图像处理操作。import numpy
:导入numpy
库,用于处理数组数据。import numpy as np
:导入numpy
库并使用np
作为别名,方便使用numpy
的函数和对象。import math
:导入math
库,用于数学计算。
-
函数定义:
getMask(img)
:- 功能:生成图像的遮罩。
- 实现:
- 创建与输入图像
img
形状相同的全零数组mask
。 - 定义
ignore_mask_color
为 255。 - 获取
img
的形状信息imshape
。 - 定义多边形顶点
vertices
作为遮罩区域的边界。 - 使用
cv2.fillPoly
函数填充mask
中由vertices
定义的区域。 - 使用
cv2.bitwise_and
对img
和mask
进行位与操作,生成遮罩后的图像mask_img
。 - 返回
mask_img
。
- 创建与输入图像
baseHufu()
:- 功能:处理车道图像,包括灰度化、滤波、边缘检测、遮罩和直线检测。
- 实现:
- 读取车道图像
./image/chedao.jpg
。 - 将图像灰度化得到
gray
。 - 使用
cv2.GaussianBlur
对gray
进行高斯滤波,核大小为(kernel_size, kernel_size)
。 - 使用
cv2.Canny
进行边缘检测。 - 调用
getMask
函数生成遮罩图像mask_img
。 - 使用
cv2.HoughLinesP
进行直线检测,设定直线检测的参数(最小长度、最大长度、最大线段间隙等)。 - 遍历检测到的直线,在原始图像
img
上绘制红色直线。
- 读取车道图像
hF()
:- 功能:处理图像
./image/huofu1.png
,包括灰度化、滤波、二值化、直线检测和角度计算。 - 实现:
- 读取图像。
- 进行灰度化、高斯滤波和二值化操作。
- 使用
cv2.HoughLinesP
进行直线检测,设定相应参数。 - 遍历检测到的直线,在原始图像
img
上绘制红色直线。 - 计算直线的斜率
theta
,并将其转换为弧度angle
,再转换为角度。 - 打印直线的角度。
- 显示部分处理结果图像(
thrsh
、hu
、img
)。
- 功能:处理图像
-
主程序部分:
if __name__ == '__main__':
:- 功能:确保代码作为脚本运行时执行相应的函数。
- 调用
hF()
函数。