2016-06-19 8 views
1

私はプログラミングには全く新しいので、神経を使うにはPython(2.7.6)、OpenCV、ROSを理解しようとしていますロボットのネットワーク。OpenCV HSV値はスクリーン/カメラ上の場所によって変わります

ちょうど、正しいHSV値を取得するためにOpenCV(2.4.8)の問題に悩まされています。つまり、突然赤(約5色相)または青色(色相約110)から緑色約40/50)、カメラを動かすだけで画面の反対側に画像を表示します。

class CV: 
    def __init__(self): 

     # Initialize object 
     self.cap = cv2.VideoCapture(0) # '0' should stay or won't work for me 
     self.cap.set(cv2.cv.CV_CAP_PROP_FPS, 0.1) 

    def recognize(self): 
     while True: 
      ret, frame = self.cap.read() 
      hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 

      # Thresholding and contour finding 
      gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
      gray_blur = cv2.GaussianBlur(gray, (15, 15), 0) 
      thresh = cv2.adaptiveThreshold(gray_blur, 255, 
              cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
              cv2.THRESH_BINARY_INV, 11, 1) 
      contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, 
                cv2.CHAIN_APPROX_SIMPLE) 

      # Largest contour 
      areas = [cv2.contourArea(c) for c in contours] 
      max_index = np.argmax(areas) 
      cnt = contours[max_index] 

      # Find center 
      (x, y), radius = cv2.minEnclosingCircle(cnt) 
      center = int(x), int(y) 
      center_int = list(center) 

      # Color recognition 
      print hsv[center_int[0], center_int[1]] 

      # Show capture 
      cv2.imshow('Video', frame) 

      if cv2.waitKey(1) & 0xFF == ord('q'): 
       break 

     self.cap.release() 
     cv2.destroyAllWindows() 

    if __name__ == '__main__': 

     object = CV() 
     object.recognize() 

ですから、画面の左または右のいずれかに赤または青の円を表示しています。私はビデオ入力からの色認識のHSV値を取得しようとしています。画像は、私のウェブカメラに面している別の画面に表示されます。

私のコードでは、私が最大の輪郭を見つけてから、最小の囲み円を見つけて、中心(x、y)座標からHSV値を得ることができます。左に私のサークルを表示すると、青色のように赤色を見つけることができますが、どちらの色でも、画面の右側にサークルを表示すると、上記の緑色の範囲でHSV値が完全にオフになります。

カメラを右から左にゆっくり動かすと(カムのフレームが左から右に移動するため)、HSV値が突然青/赤から緑に変わります1つの画素から次の画素への色相(彩度と値が大きく異なるが、それらにはあまり関心がない)。

実際に画面のどこから色を取得しているのかが分かっていますが、正しいデバッグ用のテクニックが見つからないため、自分自身で答えを得ることができません。

EDIT Iは、中心に円が中心である最小外接円の座標とそれが適所にあると思われる場所を追跡するために、形状の座標を印刷しました。しかし、背景を青色(白から)に変更したところ、シェイプが画面の右側にあるときHSV値が青色になるので、HSV値が中心座標から来ないように見えますが、ないアイデアなぜ..私は間違っていたところ、私はついに見つけ、この問題に苦しんでの2日後

答えて

1

:このによって返さ

座標を:

(x, y), radius = cv2.minEnclosingCircle(cnt) 

は、xとy座標ではありませんませんが、行と列のインデックス。 だから、私は私のカメラまたはIのように符号化された中心ポイントのHSV値を左から右に円移動の場合:円上および下から色を返し、

上昇
print hsv[center_int[0], center_int[1]] 

とフレームダウン。今で

(r, c), radius = cv2.minEnclosingCircle(cnt) 
center = int(r), int(c) 
center_int = list(center) 

と関心領域:

は、私はこのような座標を改名さ

print hsv[center_int[1], center_int[0]] 

そして、すべてが働きました。

+0

あなた自身の答え、良い仕事を受け入れることができます! – Divakar

+0

私に思い出させてくれてありがとう、私は少し不安だった.. –

関連する問題