Обнаружение линии футбольного поля

Я хотел создать модель, которая может обнаруживать линии поля штрафной площади. Мне удалось получить желаемые результаты для одного конкретного изображения, изменив некоторые гиперпараметры, но тот же код не работает для другого изображения. т. е. код достаточно специфичен для изображения. Если я хочу, чтобы код работал для каждого изображения, какие изменения я должен сделать.

Одно из входных изображений, которые я взял в качестве входных данных, здесь, здесь вывод для изображения здесь. Один из случаев сбоя, который я получил для изображения во время выполнения кода, здесь

этот код специфичен для изображения, представленного выше, и не работает для другого изображения. Пожалуйста, дайте мне знать, как я могу улучшить свой код.

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("C:/Users/user/Desktop/football1.jpg")

low_threshold = np.array([0,90,0], dtype=np.uint8)
high_threshold = np.array([170,255,255], dtype=np.uint8)  


mask1 = cv2.inRange(img, low_threshold, high_threshold)
cv2.imshow("mask1",mask1)

l_threshold = np.array([0, 115, 0], dtype=np.uint8)
h_threshold = np.array([75, 147, 172], dtype=np.uint8)  

mask2=cv2.inRange(img, low_threshold , high_threshold)
cv2.imshow("mask2",mask2)
and1=cv2.bitwise_and(img,img,mask=mask1)
cv2.imshow("and1",and1)

and2=cv2.bitwise_and(and1,and1,mask=mask2)
cv2.imshow("and2",and2)

lowest=np.array([73, 145, 45], dtype=np.uint8)
highest=np.array([114, 255, 255], dtype=np.uint8)

mask3=cv2.inRange(and2, lowest , highest)
cv2.imshow("and3",mask3)
and3=cv2.bitwise_and(and2,and2,mask=mask3)
cv2.imshow("and3",and3)
gray=cv2.cvtColor(and3,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray)

gaussian=cv2.GaussianBlur(gray, (3, 3), 5)
cv2.imshow("gaussian",gaussian)

edge=cv2.Canny(gaussian, 10, 150)
cv2.imshow("edge",edge)

rho = 1

# 1 degree
theta = (np.pi/180) * 1
threshold = 15
min_line_length = 20
max_line_gap = 10

lines=cv2.HoughLinesP(edge, rho, theta, threshold, np.array([]),
                     minLineLength=min_line_length, maxLineGap=max_line_gap)
for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(img, (x1, y1), (x2, y2), [0,255,0], 1)
        m=(y2-y1)/(x2-x1)
        print ("y="+str(round(m,2))+ "x+"+str(y2-y1))

cv2.imshow('output',img)

cv2.waitKey(0)
cv2.destroyAllWindows()
#cv2.imshow('output',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

0 ответов

Другие вопросы по тегам