摄像头无法检测python中的多种颜色

摄像头无法检测python中的多种颜色,python,opencv,raspberry-pi,Python,Opencv,Raspberry Pi,我正试图让我的相机同时检测红色和绿色。 现在它可以成功地检测任何一种颜色,但不能同时检测两种颜色 ball_color=('red','green') 如果我把它改成ball\u color=('red')或ball\u color=('green'),它可以工作,但当我把ball\u color=('red','green')改成ball\u color=('red','green')时,会有错误 我在底部添加了错误代码。非常感谢 import cv2 import numpy as np

我正试图让我的相机同时检测红色和绿色。 现在它可以成功地检测任何一种颜色,但不能同时检测两种颜色

ball_color=('red','green')
如果我把它改成ball\u color=('red')或ball\u color=('green'),它可以工作,但当我把ball\u color=('red','green')改成ball\u color=('red','green')时,会有错误

我在底部添加了错误代码。非常感谢

import cv2
import numpy as np


ball_color=('red','green')

color_dist = {'red': {'Lower': np.array([0, 60, 60]), 'Upper': np.array([10, 255, 255])},
             'green': {'Lower': np.array([35, 43, 35]), 'Upper': np.array([90, 255, 255])},
             }

cap = cv2.VideoCapture(0)
cv2.namedWindow('camera', cv2.WINDOW_AUTOSIZE)

while cap.isOpened():
   ret, frame = cap.read()
   if ret:
       if frame is not None:
           gs_frame = cv2.GaussianBlur(frame, (5, 5), 0)                     # 高斯模糊
           hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)                 # 转化成HSV图像
           erode_hsv = cv2.erode(hsv, None, iterations=2)                   # 腐蚀 粗的变细
           inRange_hsv = cv2.inRange(erode_hsv, color_dist[ball_color]['Lower'], color_dist[ball_color]['Upper'])
           cnts = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]

           c = max(cnts, key=cv2.contourArea)
           rect = cv2.minAreaRect(c)
           box = cv2.boxPoints(rect)
           cv2.drawContours(frame, [np.int0(box)], -1, (0, 255, 255), 2)

           cv2.imshow('camera', frame)
           cv2.waitKey(1)
    

cap.release()
cv2.waitKey(0)
cv2.destroyAllWindows()
错误代码如下:

Traceback (most recent call last):
  File "/Users/fangyaoting/PycharmProjects/pythonProject/顏色辨識.py", line 21, in <module>
    inRange_hsv = cv2.inRange(erode_hsv, color_dist[ball_color]['Lower'], color_dist[ball_color]['Upper'])
KeyError: ('red', 'green')
回溯(最近一次呼叫最后一次):
文件“/Users/fangyaoting/pycharm项目/python项目/顏色辨識.py“,第21行,in
inRange\u hsv=cv2.inRange(腐蚀\u hsv,颜色距离[球颜色]['Lower'],颜色距离[球颜色]['Upper']))
KeyError:(“红色”、“绿色”)

我想可能是灵魂:

导入cv2
将numpy作为np导入
球的颜色=(‘红色’、‘绿色’)
color_dist={'red':{'Lower':np.array([-10100100]),'Upper':np.array([10255255]),
绿色:{'Lower':np.array([35,43,35]),'Upper':np.array([90,255,255]),
}
cap=cv2.视频捕获(0)
cv2.namedWindow('camera',cv2.WINDOW\u AUTOSIZE)
而cap.isOpened():
ret,frame=cap.read()
如果ret:
如果框架不是无:
gs_frame=cv2.GaussianBlur(frame,(5,5,0)#高斯模糊
hsv=cv2.CVT颜色(gs_框架,cv2.COLOR_BGR2HSV)#转化成高速列车图像
侵蚀(hsv,无,迭代次数=2)#腐蚀 粗的变细
b_形=hsv形[0],hsv形[1],1
inRange_hsv=np.Zero(b_形,hsv.dtype)
对于球颜色的i:
inRange_hsv_tmp=cv2.inRange(侵蚀_hsv,颜色分布[i][‘下’],颜色分布[i][‘上’]))
inRange\u hsv=cv2.按位\u或(inRange\u hsv,inRange\u hsv\u tmp)
cnts=cv2.findContours(在范围内复制(),cv2.RETR\u外部,cv2.CHAIN\u近似简单)[-2]
如果len(cnts)>0:
c=最大值(CNT,键=cv2.轮廓面积)
rect=cv2.minareact(c)
长方体=cv2.长方体点(矩形)
cv2.绘图轮廓(框架[np.int0(框)],-1,(0,255,255),2)
cv2.imshow(“摄像机”,帧)
cv2.等待键(1)
其他:
打印(“無畫面")
其他:
打印(“無法讀取鏡頭!")
第1章释放()
cv2.等待键(0)
cv2.destroyAllWindows()
您试图将字符串的元组作为参数传递给
cv2.inRange
,它可以处理元组长度1,但不能处理更多的参数。因此,您应该迭代它们,并对每种颜色分别使用
cv2.inRange
,然后使用
cv2.bitwise\u或
对它们进行“concat”二进制图像。
关于
cnts
:有时它找不到任何轮廓,所以您应该使用
if
语句来控制它。

编辑:在这行中
inRange\u hsv=cv2.按位\u或(inRange\u hsv,inRange\u hsv\u tmp)

您好!非常感谢您的帮助。我尝试将您的代码粘贴到我的程序中,没有错误,但相机无法检测到任何颜色。在您的代码中有一件事
较低:np.数组([-10,100,100])
您确定在opencv的颜色空间中可以使用-10值吗?对不起,我犯了一个小错误,请检查我的答案中的更改。非常感谢,它现在起作用了。您是一个救命恩人!!!谢谢!