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

Python OpenCV HSV值根据屏幕/摄像机上的位置而变化,python,opencv,numpy,image-processing,computer-vision,Python,Opencv,Numpy,Image Processing,Computer Vision,我对所有编程都很陌生,一直在尝试掌握Python(2.7.6)、OpenCV和ROS,以便能够在机器人中使用神经网络 我现在陷入了OpenCV(2.4.8)的问题,无法获得正确的HSV值,简言之,当我只移动相机/在屏幕另一侧显示图像时,它突然从红色(色调约为5)或蓝色(色调约为110)变为绿色(色调约为40/50) class CV: def __init__(self): # Initialize object self.cap = cv2.Video

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

我现在陷入了OpenCV(2.4.8)的问题,无法获得正确的HSV值,简言之,当我只移动相机/在屏幕另一侧显示图像时,它突然从红色(色调约为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值会从一个像素到下一个像素突然从蓝色/红色变为绿色(饱和度和值也有很大的不同,但不太感兴趣)

我认为这与我在屏幕上的实际颜色来源有关,但我自己找不到正确的调试技巧来获得答案。。我希望你们中的一个能帮助我

编辑
我已经在形状的中心坐标处打印了一个圆,以跟踪最小封闭圆的中心坐标所在的位置,这似乎已经就位。但是,我将背景更改为蓝色(从白色),现在我发现当形状位于屏幕右侧时,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]]
一切都解决了