import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import random
img = cv.imread("../SampleImages/GreenBoard.jpg")
print(img.shape)
plt.imshow(img[:,:,::-1])
#将图像转为二值图
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
plt.imshow(gray, cmap=plt.cm.gray)
#使用Canny边缘检测
edges = cv.Canny(gray, 50, 150)
plt.imshow(edges, cmap=plt.cm.gray)
#霍夫线检测
#cv.HoughLines(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
#image: 必须是二值图像,推荐使用canny边缘检测的结果图像;
#rho: 线段以像素为单位的距离精度,double类型的,推荐用1.0
#theta: 线段以弧度为单位的角度精度,推荐用numpy.pi/180
#threshod: 累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先用100试试
#lines:这个参数的意义未知,发现不同的lines对结果没影响,但是不要忽略了它的存在
#minLineLength:线段以像素为单位的最小长度,根据应用场景设置
#maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔(断裂),超过了设定值,则把两条线段当成一条线段,值越大,允许线段上的断裂越大,越有可能检出潜在的直线段
#参考资料:https://blog.csdn.net/dcrmg/article/details/78880046
lines = cv.HoughLines(edges, 0.8, np.pi / 180, 150)
#绘制霍夫线检测结果
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), (0,0,255))
plt.imshow(img[:,:,::-1])