OpenCV HSV值根据屏幕/相机上的位置而变化

我对所有编程都很陌生,一直试图掌握Python(2.7.6),OpenCV和ROS,以便能够在机器人中使用神经网络。

我现在被困在OpenCV(2.4.8)的问题中,获得正确的HSV值,简而言之,它突然从红色(约为Hue 5)或蓝色(Hue约为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值突然从蓝/红色变为绿色色调(极大地不同的饱和度和数值也是如此,但对这些值不太感兴趣)从一个像素到另一个像素。

我认为这与屏幕上的位置有关,实际上我从中获取颜色,但我无法找到正确的调试技巧来自己找到答案。我希望你们其中一位能够帮助我!

编辑我已经在形状的中心坐标处打印了一个圆圈,以便跟踪最小包围圆的中心坐标位置以及似乎已到位的位置。 但是,我将背景更改为蓝色(从白色),现在我发现当形状位于屏幕的右侧时,HSV值为蓝色,因此似乎HSV值不是来自中心坐标,但我有不知道为什么..


在为这个问题挣扎了两天之后,我终于找到了我出错的地方:

由此返回的坐标:

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

不是x和y坐标,而是行和列索引。 因此,当我将相机或圆圈从左向右移动时,我编码为中心点的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]]

并且全部解决了。

链接地址: http://www.djcxy.com/p/35411.html

上一篇: OpenCV HSV value changes depending on location on the screen/camera

下一篇: Assertion error with Android opencv when using findHomography