我试图找到不完整圆的交点,如下图所示:

python - 用python查找不完整圆的交点-LMLPHP

参考此链接的解决方案:
Detect semi-circle in opencv

我正在尝试将c++代码转换为python代码,我已经转换了大多数代码,但是我不明白下面的2行c++代码:

  • 为什么半径需要除以25?
    // maximal distance of inlier might depend on the size of the circle
    float maxInlierDist = radius/25.0f;
    
  • 我完全不知道如何将此C++行转换为python:
    if(dt.at<float>(cY,cX) < maxInlierDist)
    

  • 希望任何人都能对此有所帮助,谢谢!

    我试图用谷歌搜索一些数学公式,但是找不到为什么半径需要除以25。我在c++中也不是很好。

    我转换后的代码:
    # 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)
    

    这里最重要的问题是:如何知道/识别圆上的绿色采样点是离群值,蓝色点是离群值。

    最佳答案

    1)已选择1/25作为半径的任意分数,以获得最大可接受误差。

    2)在opencv python中,矩阵存储为多维numpy数组。要访问(cY,cX)处的点,请使用dt [cY,cX]

    关于python - 用python查找不完整圆的交点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56967444/

    10-12 22:19
    查看更多