对于所有程序设计我都是新手,并且一直在尝试掌握Python(2.7.6),OpenCV和ROS,以便能够在机器人中使用神经网络。

我现在陷入了获取正确的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值会突然从蓝色/红色变为绿色(色调很大)从一个像素到下一个像素也具有不同的“饱和度”和“值”值,但对这些值的兴趣较小。

我认为这与屏幕上我实际从何处获取颜色有关,但我只是找不到正确的调试技巧来自己解决问题。.我希望你们中的一个能帮助我!

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

并且全部解决了。

关于python - OpenCV HSV值根据屏幕/摄像机的位置而变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37911669/

10-16 03:29