2016-11-06 120 views
0

私は赤いレーザー(ドットと線形)を持っています。私はそれを探して、最小二乗法を使用して、レーザーの画像に最も近い位置にある線を取得したい。私は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 

、私はレーザー画像の中心を通る直線を取得しなければならなかったドットレーザを用いました。しかし、ここで私が得たものです: enter image description here

プリント(X1、Y1、X2、Y2)の助けを借りて、私は、関数は右それらの上に構築されていることに気づいた位置の座標に対応していません。レーザーのカメラを動かすと、ラインがy = xに対してレーザーのイメージとほぼ対称であることがわかりました。だから、次のように、私は逆の機能を使用しています

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

を、結果は次のとおりです。 4698、29126、3726、805208、19575、-1671、:enter image description here

は今Y-COORDSは次のようになります-2952、13194 ....

私はこの問題を解決しようとしています。私は間違って何をしていますか?

+0

、あなたはレーザーポインターのセンターを見つけようとしていますか? –

+0

いいえ。「新しい」配列にレーザードットのすべてのピクセル座標があります。次に、それらをそれぞれXSアレイとYSアレイに分割します。そして、私は、レーザードット(白いボール)に最も近いところに線を置く必要があります。ですから、私は線形方程式y = Ax + Bが必要です。それに対して、私は最小二乗法を使用します。この場合、レーザー像は球状であるため、線は中心を通り抜ける必要があります。それぞれの点の近くに配置されています。 – askrav

+0

失敗した例ではなく、得ようとしている例を示した場合に役立ちます。 –

答えて

0

なぜ動作するのかわかりませんが、動作します。私はY座標とYS X座標の配列XSの位置に書きました:

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

このようにすべてうまくいきます。

そして、これが結果です:私は完全に質問を理解していないenter image description here

+0

numpy傾向'(x、y)'とopencv '(row、col)'を処理するには –

+0

残念ながら、私はそれに注意を払っていませんでした – askrav

関連する問題