Углы наклона не рассчитываются правильно по заданным двум точкам на сгенерированном OpenCV изображении (без комков) - PullRequest
0 голосов
/ 07 апреля 2019

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

Я попытался поменять параметры, также попытался добавить 180,90 -360, -180 градусов от наклона. При добавлении 45 или -45 других склонов портятся (без добавив 45 / -45 также, все еще это не близко к точному значению).

lines slope

def dist(xc,yc,lin_arr):

    distance =math.sqrt( ((xc -lin_arr[0])**2)+((yc -lin_arr[1])**2) )

    m=0
    m=int((yc-lin_arr[1])/(xc-lin_arr[0]) )
    slope=math.degrees(math.atan(m))+45
    print("distance",distance,xc,yc,lin_arr,"slope:",(slope))

    return distance,(slope)

Переменные xc & yc - это координаты x и y центральной точки или точки 1. lin_arr - это значение точки в формате массива точки 2 ().

Хотя lin_arr является производным от строки кода ниже:

ret,thresh = cv2.threshold(img,max_lin ,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for i in range(0,len(contours)):
            cnt = contours[i]
            rect = cv2.minAreaRect(cnt)
            box = cv2.boxPoints(rect)
            listy = []
            for row in range(4):
                inner_list = []
                for col in range(2):
                    inner_list.append(box[row][col])

                listy.append(inner_list)

            print("tjos/n",listy)

            for i in range(4):
                s,slope= dist(xc,(2*yc),listy[i])
                im=cv2.line(img, tuple((xc,(2*yc))), tuple(listy[i]), (0,255,0), 2, cv2.LINE_AA, 0)

1 Ответ

0 голосов
/ 07 апреля 2019

Вы игнорируете тот факт, что у равен 0 в верхней части. Поэтому наклон, который будет:

m = (y2-y1) / (x2-x1)

Теперь должно быть:

m = ((img_height-y2)-(img_height-y1) / (x2 -x1)

И вы можете переписать это как:

m = (img_height - y2 - img_height + y1) / (x2 -x1)
m = (y1-y2) / (x2 -x1)  # -y2+y1 == y1-y2

Тогда:

slope = math.degrees(math.atan(m))

Конечно, вы все равно должны обрабатывать крайние случаи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...