直线检测在我们的图像处理算法中是非常重要的。
博文https://blog.csdn.net/WZZ18191171661/article/details/101116949
对常用的直线检测算法进行了汇总性介绍,并给出了性能对比。
无奈,本人和很多小伙伴一样,看到上面这篇博文的时间晚了,有几个代码的下载链接已经失效了。
可是这些直线检测算法又很诱人,所以本人经过一番周折,找齐了文中的所有代码。
同时,为了避免将来更多的下载链接失效,所以索性把所有的代码都保存在这篇博文中,以供自己和大家将来使用的方便。
# coding=utf-8
# 导入相应的python包
import cv2
import numpy as np
# 读取输入图片
img = cv2.imread('test3.jpg')
# 将彩色图片灰度化
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 使用Canny边缘检测
edges = cv2.Canny(gray,50,200,apertureSize = 3)
# 进行Hough_line直线检测
lines = cv2.HoughLines(edges,1,np.pi/180, 200)
print(lines)
# 遍历每一个r和theta
for i in range(len(lines)):
r,theta = lines[i, 0, 0], lines[i, 0, 1]
# 存储cos(theta)的值
a = np.cos(theta)
# 存储sin(theta)的值
b = np.sin(theta)
# 存储rcos(theta)的值
x0 = a*r
# 存储rsin(theta)的值
y0 = b*r
# 存储(rcos(theta)-1000sin(theta))的值
x1 = int(x0 + 1000*(-b))
# 存储(rsin(theta)+1000cos(theta))的值
y1 = int(y0 + 1000*(a))
# 存储(rcos(theta)+1000sin(theta))的值
x2 = int(x0 - 1000*(-b))
# 存储(rsin(theta)-1000cos(theta))的值
y2 = int(y0 - 1000*(a))
# 绘制直线结果
cv2.line(img,(x1,y1), (x2,y2), (0,255,0),2)
# 保存结果
cv2.imwrite('test3_r.jpg', img)
cv2.imshow("result", img)
cv2.waitKey(0)
# coding=utf-8
# 导入相应的python包
import cv2
import numpy as np
# 读取输入图片
img = cv2.imread('test3.jpg')
# 将彩色图片灰度化
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 使用Canny边缘检测
edges = cv2.Canny(gray,50,200,apertureSize = 3)
# 进行Hough_line直线检测
lines = cv2.HoughLinesP(edges,1,np.pi/180, 80, 30, 10)
# 遍历每一条直线
for i in range(len(lines)):
cv2.line(img,(lines[i, 0, 0],lines[i, 0, 1]), (lines[i, 0, 2],lines[i, 0, 3]), (0,255,0),2)
# 保存结果
cv2.imwrite('test3_r.jpg', img)
cv2.imshow("result", img)
cv2.waitKey(0)
# coding=utf-8
import cv2
import numpy as np
# 读取输入图片
img0 = cv2.imread("test3.jpg")
# 将彩色图片转换为灰度图片
img = cv2.cvtColor(img0,cv2.COLOR_BGR2GRAY)
# 创建一个LSD对象
lsd = cv2.createLineSegmentDetector(0)
# 执行检测结果
dlines = lsd.detect(img)
# 绘制检测结果
for dline in dlines[0]:
x0 = int(round(dline[0][0]))
y0 = int(round(dline[0][1]))
x1 = int(round(dline[0][2]))
y1 = int(round(dline[0][3]))
cv2.line(img0, (x0, y0), (x1,y1), (0,255,0), 1, cv2.LINE_AA)
# 显示并保存结果
cv2.imwrite('test3_r.jpg', img0)
cv2.imshow("LSD", img0)
cv2.waitKey(0)
cv2.destroyAllWindows()
# coding=utf-8
import cv2
import numpy as np
# 读取输入图片
img0 = cv2.imread("test3.jpg")
# 将彩色图片转换为灰度图片
img = cv2.cvtColor(img0,cv2.COLOR_BGR2GRAY)
# 创建一个LSD对象
fld = cv2.ximgproc.createFastLineDetector()
# 执行检测结果
dlines = fld.detect(img)
# 绘制检测结果
# drawn_img = fld.drawSegments(img0,dlines, )
for dline in dlines:
x0 = int(round(dline[0][0]))
y0 = int(round(dline[0][1]))
x1 = int(round(dline[0][2]))
y1 = int(round(dline[0][3]))
cv2.line(img0, (x0, y0), (x1,y1), (0,255,0), 1, cv2.LINE_AA)
# 显示并保存结果
cv2.imwrite('test3_r.jpg', img0)
cv2.imshow("LSD", img0)
cv2.waitKey(0)
cv2.destroyAllWindows()
EDlines直线检测算法论文百度网盘下载链接:
https://pan.baidu.com/s/1wIegM9nt97P1sq1HPrjL1g?pwd=b7of
EDlines直线检测算法我提供两个源码给大家。
首先是博文https://blog.csdn.net/WZZ18191171661/article/details/101116949中提供给大家的。
百度网盘下载链接:
https://pan.baidu.com/s/1-8zIXli1nV5V-guxYvnF8w?pwd=9u02
注意:这个代码原作者已经进行更新了,所以其主函数所在的代码并不与博文https://blog.csdn.net/WZZ18191171661/article/details/101116949中给大家展示的主函数代码一样了,但是算法是相同的算法。
另一个是某老外使用以上代码后上传分享的,下载链接如下:
https://pan.baidu.com/s/1tUQ_6INiDLn59of59IAxww?pwd=n8g7
这个代码还附带了代码运行时的原图片和结果图片,如下图所示:
还需要注意:上面两个代码要想正常编译,都需要你的开发环境配置了ARPACK。
论文下载链接:
https://pan.baidu.com/s/12raOHnfHZvLaPLkvNr1A7Q?pwd=byus
源码百度网盘下载链接:
https://pan.baidu.com/s/1roU8z07tzHiPY4Nm2VIFqQ?pwd=fdjm
源码中带了测试图片,如下图所示:
博文https://blog.csdn.net/WZZ18191171661/article/details/101116949提供的这个算法的论文和源码链接均已失效。
我花了些时间和精力,找到了,该源代码是C++写成的,需要OpenCV的支持。
下面是下载链接:
因为是自己花费时间和精力找寻的,所以我上传到了CSDN的付费下载区(1.9元即可下载),敬请大家见谅,下载链接:
https://download.csdn.net/download/wenhao_ir/85336811
由于CSDN的下载区不允许上传论文,所以需要论文的同学可以下载后私信我,我工作时都开启CSDN的,所以回复得很快的。
相关截图如下:
这个算法的论文百度网盘下载链接:
https://pan.baidu.com/s/1lWSu5APa55ahXRELUFvpxQ?pwd=pj4h
这个算法的代码百度网盘下载链接:
链接:https://pan.baidu.com/s/1QWP5946yuwdEVG8sRFhZyg?pwd=ow0p
这个算法的论文和代码下载链接也失效了,不过经过一番周折,我也找到了。
博主大概看了一下,LSM直线检测算法的主体代码是用C写成的,但是是用Matlab调用的,即把用C写的代码编译成MEX文件供MALTAB调用,整个代码基本没有注释。
因为是自己花时间和精力找到的,所以我也上传到了CSDN的付费下载区,敬请大家谅解。
下载链接:
https://download.csdn.net/download/wenhao_ir/85337139
由于CSDN下载区不允许上传论文,所以需要论文的朋友请下载后私信博主,博主工作时都开着CSDN的,所以会很快回复的。
如果上面的LSM算法程序运行时提示lsd.mexw64无效,大家可以用MinGW64 Compiler 重新编译lsd.c,如下图所示:
如果提示缺少需要的符号’mxErrMsgTxt’,那么把下面的代码注释掉: