I try to detect lines on a Tenniscourt. So far used Canny Edge and HoughLines transformation.
import cv2
import numpy as np
img = cv2.imread('./images/tennis.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
lines = cv2.HoughLines(edges,1,np.pi/180,200)
i = 0
for line in lines:
if i < 10:
for rho,theta in line:
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))
cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
i += 1
cv2.imwrite('houghlines.jpg',img)
But so far the result is not very satisfying:
Output: https://i.stack.imgur.com/wrok7.jpg
Input: https://i.stack.imgur.com/RZy1q.jpg
Any Ideas on how to improve the result?
One thing you could do is create an algorithm to classify whether a line is actually a tennis court line. Your program seems to be looking for any line in the image, so it gives you lines that appear in the image but are not tennis court lines. Perhaps use supervised learning to create a model that takes in those lines as input and classifies them as being a tennis court line or not a tennis court line. Just one thing you could do. It wouldn’t help you with undetected lines but it would filter out incorrectly detected lines