Поиск точки пересечения неполного круга с питоном

Я пытаюсь найти точку пересечения неполного круга, как показано на рисунке ниже:

Поиск точки пересечения неполного круга с питоном

Ссылаясь на решение этой ссылки: Обнаружить полукруг в opencv

Я пытаюсь преобразовать код С++ в код Python, я преобразовал большую его часть, но я не понимаю две строки кода С++, которые приведены ниже:

  1. Почему радиус нужно делить на 25?

    // maximal distance of inlier might depend on the size of the circle
    float maxInlierDist = radius/25.0f;
    
  2. Я совершенно не знаю, как преобразовать эту строку C++ в python:

    if (dt.at<float>(cY,cX) < maxInlierDist) 
    

Я надеюсь, что кто-нибудь может помочь мне в этом, спасибо!

Я пытался найти в Google какую-то математическую формулу, но не могу найти, почему радиус нужно делить на 25. Я также не так хорош в С++.

Мой преобразованный код:

# import the necessary packages
import numpy as np
import argparse
import cv2
import math

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-t", "--thres", required = True, help = "Path to the image")
ap.add_argument("-i", "--image", required = True, help = "Path to the image")
args = vars(ap.parse_args())

# load the image, clone it for output, and then convert it to grayscale
image = cv2.imread(args["image"])

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gray = cv2.Canny(gray, 200,20)

# detect circles in the image
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1,minDist=300,  
                               param1=200, param2=20,
                               minRadius=0, maxRadius=0)

#gray = (255*mask).astype(np.uint8)

dt = cv2.distanceTransform(255-gray, cv2.DIST_L2, 3)

cv2.imshow('Distance Transform', dt/255.0)
# ensure at least some circles were found

if circles is not None:
    # convert the (x, y) coordinates and radius of the circles to integers
    circles = np.round(circles[0, :]).astype("int")

    # loop over the (x, y) coordinates and radius of the circles
    for (x, y, r) in circles:
        # draw the circle in the output image, then draw a rectangle
        # corresponding to the center of the circle
        cv2.circle(image, (x, y), r, (0, 255, 0), 2)
        cv2.rectangle(image, (x - 5, y - 5), (x + 5, y + 5), 
                             (0, 128,255),-1)

        minInlierDist = 2.0
        counter =0
        inlier =0
        radius=r
        num_circle = 50

        maxInlierDist=radius/25.0
        if maxInlierDist<minInlierDist:
            maxInlierDist=minInlierDist

        for index in range(num_circle):
            counter +=1
            #angle = t * math.pi / 180
            angle = 2 * math.pi * index / num_circle

            cX = x + math.sin(angle)*radius
            cY = y + math.cos(angle)*radius
            centerxy = cX,cY
            cv2.circle(image,tuple(np.array(centerxy,int)),3,(0,0,255),-1)

#if (dt.at<float>(cY,cX) < maxInlierDist) #c++ ! I'm stuck here!

    cv2.imshow("output", image)#np.hstack([image, gray]))
    cv2.waitKey(0)
else:
    print("no circles found!")
    cv2.waitKey(0)

Самый важный вопрос здесь: как узнать/идентифицировать Зеленые точки выборки на круге являются выбросами, а синие точки - выбросами.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
606
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

1) 1/25 выбрана как произвольная доля радиуса для максимально допустимой погрешности.

2) В opencv python матрицы хранятся в виде многомерных массивов numpy. Чтобы получить доступ к точке (cY,cX), используйте dt[cY,cX]

Большое спасибо, это решило мою проблему. Еще раз спасибо.

Edmond Eugenes 10.07.2019 15:18

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