pythonopencvhoughlinesp

OpenCV houghLinesP parameters


I am having difficulty finding the lines on a chessboard in this image using HoughLinesP with OpenCV in Python.

In an attempt to understand the parameters of HoughLinesP, I have come up with the following code:

import numpy as np
import cv2
from matplotlib import pyplot as plt
from matplotlib import image as image

I = image.imread('chess.jpg') 
G = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY)

# Canny Edge Detection:
Threshold1 = 150;
Threshold2 = 350;
FilterSize = 5
E = cv2.Canny(G, Threshold1, Threshold2, FilterSize)

Rres = 1
Thetares = 1*np.pi/180
Threshold = 1
minLineLength = 1
maxLineGap = 100
lines = cv2.HoughLinesP(E,Rres,Thetares,Threshold,minLineLength,maxLineGap)
N = lines.shape[0]
for i in range(N):
    x1 = lines[i][0][0]
    y1 = lines[i][0][1]    
    x2 = lines[i][0][2]
    y2 = lines[i][0][3]    
    cv2.line(I,(x1,y1),(x2,y2),(255,0,0),2)

plt.figure(),plt.imshow(I),plt.title('Hough Lines'),plt.axis('off')
plt.show()

The problem I am having is that this picks up only one line. If I reduce the maxLineGap to 1, it picks up thousands.

I understand why this might be but how do I pick a suitable set of parameters to get all these co-linear lines to merge? Am I missing something?

I would like to keep the code simple as I am using it as an example of this function in action.

Thanks in advance for any help!

Update: This works perfectly with HoughLines.

And there doesn't seem to be edge detection issues as Canny is working just fine.

However, I still need to get HoughLinesP to work. Any ideas??

Images here: Results


Solution

  • Ok, I finally found the problem and thought I would share the solution for anyone else driven nuts by this. The issue is that in the HoughLinesP function, there is an extra parameter, "lines" which is redundant because the output of the function is the same:

    cv2.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])

    This is causing issues with the parameters as they are read in the wrong order. To avoid confusion with the order of the parameters, the simplest solution is to specify them inside the function like so:

    lines = cv2.HoughLinesP(E,rho = 1,theta = 1*np.pi/180,threshold = 100,minLineLength = 100,maxLineGap = 50)
    

    This totally fixed my problem and I hope it will help others.