代码之家  ›  专栏  ›  技术社区  ›  Florian Spengler

如何在扭曲的图像中找到特定的标记?

  •  0
  • Florian Spengler  · 技术社区  · 2 年前

    如何在扭曲的图像中找到特定点?

    在矩形上,给出了3个圆,其坐标可通过函数HoughCircles with OpenCV找到。这是通过以下代码实现的,这些代码工作正常:

    import cv2 as cv
    import numpy as np
    
    fig1 = cv.imread('shapes.jpg', cv.IMREAD_COLOR)
    
    fig = cv.cvtColor(fig1, cv.COLOR_BGR2GRAY)
    fig = cv.medianBlur(fig, 5)
    
    rows = fig.shape[0]
    circles = cv.HoughCircles(fig, cv.HOUGH_GRADIENT, 1, rows / 8,
                               param1=100, param2=30,
                               minRadius=1, maxRadius=40)
    
    circles = np.uint16(np.around(circles))
    
    for i in circles[0,:]:
        cv.circle(fig1, (i[0], i[1]), i[2], (255, 0, 255), 3)
    
    if circles is None:
        print('No circle found!')
    
    cv.imshow("detected circles", fig1)
    cv.waitKey(0)
    
    # previously measured distances
    ABold=5 # cm
    BCold=5 # cm
    e=1 # cm
    f=1 # cm
    
    x0=float(circles[0,0,0])
    y0=float(circles[0,0,1])
    x1=float(circles[0,1,0])
    y1=float(circles[0,1,1])
    x2=float(circles[0,2,0])
    y2=float(circles[0,2,1])
    
    # calculate all distances
    A=np.sqrt(((x0-x1)**2)+((y0-y1)**2))
    B=np.sqrt(((x1-x2)**2)+((y1-y2)**2))
    C=np.sqrt(((x2-x0)**2)+((y2-y0)**2))  
    
    # determining the hypotenuse
    if A>B and A>C:
        xA=x2
        yA=y2
        xC=x1
        yC=y1
        xB=x0
        yB=y0
        AB=C
        BC=B    
    elif B>A and B>C:
        xB=x0
        yB=y0
        xA=x1
        yA=y1
        xC=x2
        yC=y2
        AB=A
        BC=C
    else:
        xC=x1
        yC=y1
        xB=x2
        yB=y2
        xA=x1
        yA=y1
        AB=A
        BC=B
    # new position of x-symbol
    xX=(xA+e*(AB/ABold))
    yX=(yA+f*(BC/BCold))
        
    from matplotlib import pyplot as plt
    
    plt.plot(xA,yA, marker="o", markersize=20, markerfacecolor="green", label="A")
    plt.plot(xB,yB, marker="o", markersize=20, markerfacecolor="red", label="B")
    plt.plot(xC,yC, marker="o", markersize=20, markerfacecolor="blue", label="C")
    plt.plot(xX,yX, marker="x", markersize=20, markerfacecolor="black")
    plt.legend()
    plt.xlim([0,1200])
    plt.ylim([0,1200])
    plt.grid()
    plt.show()
    

    抱歉,代码不完美。希望你能看穿那里。我只是很快地对它进行了编程,看看哪里会出现问题。

    在这些图片中,您可以看到拍摄的图像和使用代码生成的结果:

    Picture of Points on Plane to recognize

    Result Picture

    所有点和标记的距离都是已知的。然而,在拍摄的图像上,它们由于记录而失真。如何确定标记在失真图像上的位置?问题是:圆圈没有区别,而是以随机顺序检测到的。因此,仅仅从改变的距离来确定新的坐标是不可能的,因为我们不知道从哪个点必须获得新的距离。

    有什么想法吗?

    0 回复  |  直到 2 年前