A detecção de linha reta deve ser detectada contra a imagem binária do resultado da detecção de borda e não pode ser detectada contra a imagem cinza
A imagem binária e a imagem resultante da detecção de bordas ainda são diferentes.
O resultado da detecção do gráfico binário:
api:
cv.HoughLines (image, rho, theta, threshold, lines = None, srn = None, stn = None, min_theta = None, max_theta = None)
parâmetro: o
primeiro parâmetro é uma imagem binária, então a transformação Hough Before, binarização ou É necessária uma detecção de borda habilidosa.
A função HoughLinesP de opencv é uma função de transformação de linha Hough de probabilidade estatística, que pode gerar os pontos finais da linha detectada. Seu protótipo de função é: HoughLinesP (imagem, rho, theta, threshold [, lines [, minLineLength [, maxLineGap]] ]) -> linhas
O parâmetro image representa a imagem de saída da detecção de borda, que é uma imagem binária de 8 bits de canal único.
O parâmetro rho representa a resolução do parâmetro diâmetro polar em valores de pixel, e 1 pixel é geralmente usado aqui.
O parâmetro theta representa a resolução do parâmetro ângulo polar em radianos e 1 grau é usado aqui. Geralmente definido como CV_PI / 180;
O parâmetro de limite representa o ponto mínimo de interseção da curva necessário para detectar uma linha reta.
O parâmetro lines representa o container que armazena os pares de parâmetros da linha detectada, ou seja, as coordenadas dos dois pontos finais do segmento de linha.
O parâmetro minLineLength indica o número mínimo de pontos que podem formar uma linha reta. Linhas com pontos insuficientes serão descartadas.
O parâmetro maxLineGap representa a distância máxima de um ponto brilhante que pode ser considerado em linha reta.
demo:
import cv2
import numpy as np
image=cv2.imread("erzhi.jpg")
start=time.time()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 120)
line = 100
minLineLength = 15
lines = cv2.HoughLinesP(edges, 1, np.pi / 90, 10, lines=line, minLineLength=minLineLength)
lines1 = lines[:, 0, :]
print(time.time()-start,lines.shape)
for x1, y1, x2, y2 in lines1:
cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imshow("edges",edges)
cv2.imshow("lines",image)
cv2.waitKey()