我试图使用一个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循环来实现它。
答案 0 :(得分:0)
通过去掉for循环中的else语句解决了这个问题。将返回的“Not found”语句放在循环之外。