私は赤いレーザー(ドットと線形)を持っています。私はそれを探して、最小二乗法を使用して、レーザーの画像に最も近い位置にある線を取得したい。私はthis Numpy functionを使って、係数Python 2.7とOpenCV 3.1を得ました。OpenCV:赤いレーザーに最小二乗法を使用する
だから、ここに私のコードは次のとおりです。だから、
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
、私はレーザー画像の中心を通る直線を取得しなければならなかったドットレーザを用いました。しかし、ここで私が得たものです:
とプリント(X1、Y1、X2、Y2)の助けを借りて、私は、関数は右それらの上に構築されていることに気づいた位置の座標に対応していません。レーザーのカメラを動かすと、ラインがy = xに対してレーザーのイメージとほぼ対称であることがわかりました。だから、次のように、私は逆の機能を使用しています
y1 = (x1-B)/A
y2 = (x2-B)/A
を、結果は次のとおりです。 4698、29126、3726、805208、19575、-1671、:
は今Y-COORDSは次のようになります-2952、13194 ....
私はこの問題を解決しようとしています。私は間違って何をしていますか?
、あなたはレーザーポインターのセンターを見つけようとしていますか? –
いいえ。「新しい」配列にレーザードットのすべてのピクセル座標があります。次に、それらをそれぞれXSアレイとYSアレイに分割します。そして、私は、レーザードット(白いボール)に最も近いところに線を置く必要があります。ですから、私は線形方程式y = Ax + Bが必要です。それに対して、私は最小二乗法を使用します。この場合、レーザー像は球状であるため、線は中心を通り抜ける必要があります。それぞれの点の近くに配置されています。 – askrav
失敗した例ではなく、得ようとしている例を示した場合に役立ちます。 –