标题:Python使用OpenCV实现霍夫线变换
简介
霍夫线变换是一种基于数学方法的图像处理技术,它可以用于找到图像中的直线。OpenCV是一个常用的计算机视觉库,它提供了相应的API支持,方便我们使用Python实现霍夫变换。
步骤
1.导入库
在这个过程中,需要使用OpenCV和NumPy两个库。
import cv2
import numpy as np
2.读取图像
通过cv2.imread()函数来读取图像,需要指定读取的文件名和文件路径。
img = cv2.imread("sample.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
3.应用霍夫线变换
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
以上代码实现了对图像中的直线进行霍夫变换,其中的参数1表示霍夫变换中的ρ精度,即直线到图像原点(0, 0)的距离精度;参数2表示霍夫变换中的θ精度,即识别直线的角度精度;参数3表示在多少个点以上才判定这是一条直线。
4.绘制直线
要在图像上绘制直线,需要先用cv2.linse()函数画出直线。画直线时需要指定直线的起点和终点坐标,颜色,线条粗细等。画出直线后可以使用cv2.imshow()函数显示并保存图像。
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)
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
以上代码中的 for 循环用来遍历每一个直线,rho 和 theta 是霍夫变换的两个返回值,a 和 b 分别是该直线的参数,用于计算直线的起点和终点坐标(x1, y1)和(x2, y2)。
示例
示例1:对一张图片进行霍夫线变换并显示结果
import cv2
import numpy as np
img = cv2.imread("sample.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
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)
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例2:对一段视频进行霍夫线变换并显示结果
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
if lines is not None:
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)
cv2.line(frame, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow("result", frame)
k = cv2.waitKey(1)
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
以上代码中的 while 循环用来对视频进行处理,cap.read() 用来读取视频帧,if 判断用来判别是否有直线。
其中,cv2.waitKey(1)
的参数含义是等待键盘输入事件,1代表等待1毫秒。如果在等待时间内,有按键按下,则返回相应的ASCII值,否则返回-1。
结论
利用Python和OpenCV实现霍夫线变换是一种简单有效的图像处理技术,它可以用于图像识别、物体跟踪、平面角度检测等领域。同时,我们可以采用以上提到的代码,通过对图像和视频进行处理,来更好地了解和应用此技术。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 用opencv实现霍夫线变换 - Python技术站