In this article, we will learn about Line Detection in OpenCV Python. We will learn Line Detection in OpenCV using Hough Lines and Probabilistic Hough Lines.
Let’s Code Line Detection in OpenCV!
Line Detection Theory OpenCV
The Hough Transform is a popular technique to detect any shape if you can represent that shape in a mathematical form, It can detect the shape even if it is broken or distorted a little bit.
A line can be represented by two formulas.
In Cartesian Coordinate System
1. y = mx + c
where m is the slope and c is the intercept. (Basic Mathematics formulas)
In the polar coordinate system
2. p = x cos Ѳ + y sin Ѳ
p is the perpendicular distance from the origin. Ѳ is the angle formed by the normal of this line to the origin (radians).
Hough Transformation OpenCV Python
1. Edge detection, e.g Using the Canny Edge Detector.
2. Mapping of the edge points to the Hough space and storage in an accumulator
3. Interpretation of the accumulator to yield lines of infinite length. The interpretation is done by thresholding and possibly other constraints.
4. Conversion of infinite lines to finite lines.
Types of Hough line Transforms OpenCV Python
- The Standard Hough Transform (HoughLines method)
- The Probabilistic Hough Line Transform (HoughLinesP)
Hough Lines OpenCV Python
cv.HoughLines( binarized image, rho accuracy, Ѳ accuracy, threshold)
The threshold here is the minimum vote for it to be considered a line.
Probabilistic Hough Lines OpenCV Python
cv.HoughLinesP(binarized image, rho accuracy, Ѳ accuracy, threshold, minimum line length, max line gap)
Line Detection OpenCV Python Steps
1. Input the image in which you want to detect lines.
image = cv.imread(“source”)
2. Convert the image to grayscale using cvtColor function
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
3. Canny Edge Detection OpenCV Python
edge = cv.Canny(gray, 100,170, apertureSize = 3)
4. Hough Lines OpenCV Python
Run Hough lines of a rho accuracy of 1 pixel.
Ѳ (theta) accuracy of np.pi/180 which is one degree.
Our line threshold is set to 240 (number of points on Line).
lines = cv.HoughLines(edge, 1, np.pi/180, 240)
5. Iterate through each line
Now, we will iterate through each line and convert it to the format required by cv.lines (i.e Requiring endpoints).
for line in lines: rho, theta = line a = np.cos(theta) b = np.sin(theta) x0 = a * rho y0 = b * rho # x1 stores the rounded off value of (r* cosΘ - 1000 * sinΘ) x1 = int(x0 + 1000 * (-b)) # y1 stores the rounded off value of (r * sinΘ + 1000 * cosΘ) y1 = int(y0 + 1000 * (a)) # x2 stores the rounded off value of (r * cosΘ + 1000 * sinΘ) x2 = int(x0 - 1000 * (-b)) # y2 stores the rounded off value of (r * sinΘ - 1000 * cosΘ) y2 = int(y0 - 1000 * (a)) cv.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
Line Detection Documentation
Visit the official OpenCV web page for documentation.