opencv 检测直线,python中的opencv
在图像处理中,直线检测是一种常用的算法,通常是获得N个边缘点的集合,并找到通过这些边缘点的直线。本文将介绍如何在Python中使用OpenCV检测直线,以供参考。
00-1010 1.导言2。霍夫变换3。举个栗子3.1读取图像进行灰度化3.2进行边缘检测3.3补充霍夫变换。
目录
在图像处理中,直线检测是一种常用的算法,通常是获得N个边缘点的集合,并找到通过这些边缘点的直线。其中,最流行的直线检测器是基于Hough变换的直线检测技术。
1. 引言
Hough变换是图像处理中的一种特征提取方法,可以识别图像中的几何形状。它将在参数空间中投票以确定其对象的形状。通过检测累加的结果,它会找到一个最大值对应的解,利用这个解,它可以得到一个符合特定形状的参数。
在使用Hough变换检测直线之前,首先要使用边缘检测算法减少图像中的数据量,剔除无关信息,保留图像中重要的结构特征。
2. 霍夫变换
3. 举个栗子
首先,我们读入样本测试图像,然后使用cvtColor()函数进行灰度操作。示例代码如下:
im=cv2.imread(。/ladder . png’)
gray_img=cv2.cvtColor(im,cv2。COLOR_BGR2GRAY)
运行结果如下:
上图中,左侧为原始彩色图像,右侧为灰度化后的灰度图像。
3.1 读入图像 进行灰度化
接下来,我们使用边缘检测算法(Canny,Sobel,Laplacian等。)来检测物体的边缘。示例代码如下:
canny=cv2。Canny(gray_img,30,150)
运行结果如下:
3.2 执行边缘检测
最后,利用Hough变换得到直线检测结果。示例代码如下:
lines=cv2。HoughLines(canny,1,np.pi/180,180)
lines1=lines[:0,]
对于,在第1行[:]:
a=NP . cos()
b=NP . sin()
x0=a * rho
y0=b * rho
x1=int(x0 3000 * (-b))
y1=int(y0 3000 * (a))
x2=int(x0-3000 *(b))
y2=int(y0 - 3000 * (a))
cv2.line(im,(x1,y1),(x2,y2),(0,0,255),2)
运行结果如下:
可以看出,通过简单的几步,我们可以很容易地检测出图像中的所有直线。
3.3 进行霍夫变换
当然,Python使用OpenCV不仅可以检测直线,还可以检测直线的倾斜角度。下面是实现的核心代码。
导入cv2
将numpy作为np导入
定义线_检测(图像):
#将图片转换为HSV
hsv=cv2.cvtColor(image,cv2。COLOR_BGR2HSV)
#设置阈值
lowera=np.array([0,0,221])
uppera=np.array([180,30,255])
mask1=cv2.inRange(hsv,lowera,uppera)
kernel=np.ones((3,3),np.uint8)
#对获得的图像执行形态学运算(闭运算和开运算)。
Mask=cv2。形态学ex (mask1,cv2。morphology _ close,kernel) # close操作:表示先进行膨胀操作,再进行腐蚀操作。
Mask=cv2。形态学ex(掩模,cv2。morphology _ open,kernel) # open操作:表示先腐蚀,再膨胀。
#绘制轮廓
边缘=cv2。Canny(遮罩,50,150,孔径大小=3)
#显示图片
cv2.imshow(edges ,edges)
#检测白线这里是检测直线的条件。您可以读取HoughLinesP()函数,然后根据自己的要求设置检测条件。
lines=cv2。HoughLinesP(edges,1,np.pi/180,40,minLineLength=10,maxLineGap=10)
打印“lines=”,行
打印==============================================
i=1
#遍历通过霍夫变换获得的数据。
对于线路:中的线路
# newlines1=lines[:0,]
print line[ str(i-1) ]=,行
X1,y1,x2,y2=line[0] #两点确定一条直线,这里是通过遍历得到的两点的数据(x1,y1)(x2,y2)。
2.CVLINE (image,(x1,y1),(x2,y2),(0,0,255),2) #在原始图像上画一条线
#转换成浮点数并计算斜率
x1=浮点型(x1)
x2=浮点型(x2)
y1=浮点型(y1)
y2=浮点型(y2)
打印 x1=%s,x2=%s,y1=%s,y2=%s % (x1,x2,y1,y2)
如果x2 - x1==0:
打印“直线是垂直的”
结果=90
elif y2 - y1==0 :
打印“直线是水平的”
结果=0
else:
#计算斜率
k=-(y2 - y1)/(x2 - x1)
#求反正切,然后把弧度换算成度。
结果=np.arctan(k) * 57.29577
打印直线的倾角是: str(结果)度
i=i 1
#展示最终结果图。
cv2.imshow(line_detect ,image)
回送结果
if __name__==__main__:
#读入图片
src=cv2 . im read( lines/line 6 . jpg )
#设置窗口大小
cv2.namedWindow(输入图像,cv2。WINDOW_AUTOSIZE)
#展示原图
cv2.imshow(输入图像,src)
#呼叫功能
线路检测(src)
cv2.waitKey(0)
关于在Python中使用OpenCV进行行检测的详细解释,本文到此结束。关于Python OpenCV线检测的更多信息,请搜索热门IT软件开发工作室之前的文章或者继续浏览下面的相关文章。希望大家以后多多支持热门IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。