无法使我的多色检测阵列工作(Python和OpenCV)

时间:2015-01-21 14:36:40

标签: python loops opencv

我试图使用一个numpty数组来存储某些颜色(HSV值),以便以后能够通过使用测试来检测它们。但是,当我进行测试时,它并没有成功。这是代码:

#!/usr/bin/env python
import cv2
import numpy as np

class DetectAColor(object):

    @staticmethod
    def detect_a_color(image):
        img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

        boundaries = {
            'red': ([0, 100, 100],[10, 255, 255]),
            'brown': ([14, 100, 100],[15, 255, 255]),
            'orange': ([16, 100, 100],[17, 255, 255]),
            'yellow': ([29, 100, 100],[31, 255, 255]),
            'green': ([50, 100, 100],[60, 255, 255]),
            'lightblue': ([50, 100, 100],[60, 255, 255]),
            'darkblue': ([115, 100, 100],[125, 255, 255]),
            'purple': ([149, 150, 100],[150, 255, 255]),
            'pink': ([149, 100, 150],[149, 100, 150])
            }

        for k,v in boundaries.iteritems():
            lower_color = np.array(v[0])
            upper_color = np.array(v[1])

            mask = cv2.inRange(img_hsv, lower_color, upper_color)
            amount_not_zero = cv2.countNonZero(mask)
            if amount_not_zero > 9000:
                return k
            else:
                return "Not found"

我正在使用这个简单的测试来测试此代码(并将图像显示为100%确定):

def test_detect_red(self):
    image = np.zeros((512, 512, 3), np.uint8)
    image[:,0:512] = (0, 0, 255) # B G R values
    color = DetectAColor.detect_a_color(image)
    cv2.imshow('image',image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    # Controle dat de kleur gevonden wordt
    self.assertEqual("red", color)

我觉得很奇怪这段代码不起作用,因为起初它正在使用代码来检测1种颜色:

#!/usr/bin/env python
import cv2
import numpy as np

class DetectAColor(object):

    @staticmethod
    def detect_a_color(image):
        img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        TRACK_COLOR_MIN = np.array([0, 100, 100], np.uint8)
        TRACK_COLOR_MAX = np.array([15, 255, 255], np.uint8)

        mask = cv2.inRange(img_hsv, TRACK_COLOR_MIN, TRACK_COLOR_MAX)

        cv2.imshow('mask',mask)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

        amount_not_zero =  cv2.countNonZero(mask)
        if amount_not_zero > 9000:
            return "Found"
        else:
            return "Not found"

我理解H的值有点不同,但我尝试使用与1色代码相同的值,但它也失败了。我们已经计算了我们需要的值并使用1色方法对它们进行了测试并且它有效。所以我需要知道为什么我不能使用数组和for循环来实现它。

1 个答案:

答案 0 :(得分:0)

通过去掉for循环中的else语句解决了这个问题。将返回的“Not found”语句放在循环之外。