【问题标题】:OpenCV: Using the method of least squares to the red laserOpenCV:对红色激光使用最小二乘法
【发布时间】:2016-11-06 21:35:31
【问题描述】:

我有一个红色激光(点和线性)。我想找到它并使用最小二乘法得到一条最接近激光图像的线。我使用this Numpy function 来获取系数,Python 2.7 和 OpenCV 3.1。

所以,这是我的代码:

while loop == 1:
         rval, frame = vc.read()
         frame = imutils.resize(frame, width=640, height=480)

         red, green, blue = cv2.split(frame)
         rbin, thresholdImg = cv2.threshold(red, 240, 255, cv2.THRESH_BINARY)   

         new = np.argwhere(thresholdImg == 255)             #Get only RED pixels
         if len(new) == 0:                                   #If laser lost
             assistantView(3,assistantImg)      
         else:

             xs = []
             ys = []

             for (x,y) in new:                                  #Extract red pixels positions
                xs = np.append(xs,x)
                ys = np.append(ys,y)

             ArrayToResult = np.vstack([xs, np.ones(len(xs))]).T
             m, c = np.linalg.lstsq(ArrayToResult, ys)[0]   #Applying least squares method

             A = m
             B = c

             x1 = np.amin(xs)                   #Take "left" and "right" X-coords 
             x2 = np.amax(xs)
             ymin = int(np.amin(ys))                               
             ymax = int(np.amax(ys))

             y1 = x1*A + B              #Get line
             y2 = x2*A + B

             x1 = int(x1)
             x2 = int(x2)
             y1 = int(y1)
             y2 = int(y2)

             print(x1, y1, x2, y2)

             cv2.line(thresholdImg,(x1,y1),(x2,y2),(255,0,0),1)                     #Draw a line

因此,使用点激光我必须得到一条穿过激光图像中心的直线。但这是我得到的:

print(x1, y1, x2, y2) 的帮助下,我注意到函数是建立在它们之上的,不对应激光位置的坐标。移动相机,我注意到这条线相对于 y=x 与激光的图像几乎对称。所以,我使用了如下的反函数:

  y1 = (x1-B) / A              
  y2 = (x2-B) / A 

结果是:

现在 Y 坐标如下所示: 4698、29126、3726、805208、19575、-1671、-2952、13194....

第二天,我正在尝试解决这个问题。我究竟做错了什么?

【问题讨论】:

  • 我没完全理解这个问题,你是想找到激光笔的中心吗?
  • 没有。我在“新”数组中拥有激光点的所有像素坐标。然后,我将它们分别拆分为 XS 和 YS 数组。然后我需要找到最靠近激光点(白球)的线。所以我需要一个线性方程 y=Ax + B 并且为此我使用最小二乘法。因为在这种情况下,激光图像是球形的,所以线应该通过中心,因为它靠近每个点
  • 如果你展示了一个你希望得到的例子,而不是失败的例子,这会有所帮助。
  • 我可以很容易地给你一个例子,如何通过中心画线,但它不需要公式。
  • 好的。我需要得到线的方程,它位于激光的每个点附近。在这种情况下,激光有一个球的形状,那么这样的一条线肯定会穿过中心。我这样做是为了在使用激光线时,相机会看到类似这样的内容:i.stack.imgur.com/LdlOl.jpg,我可以用激光线替换激光图像。

标签: python opencv numpy


【解决方案1】:

我不知道它为什么有效,但它有效。我在 Y 坐标的数组 XS 位置和 YS X 坐标中写了:

for (x,y) in new:                  
     xs = np.append(xs,y) #was X
     ys = np.append(ys,x) #was Y

这种方式一切正常。

结果如下:

【讨论】:

  • 是真的,可惜没注意
猜你喜欢
  • 2013-03-01
  • 1970-01-01
  • 2021-09-29
  • 2014-04-28
  • 2012-02-10
  • 2018-08-26
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多