【发布时间】: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,我可以用激光线替换激光图像。