怎么通过hsv定位到不同的颜色,并且画圆
首先我们先通过OpenCV来获取当前图片,从而获取到它们的hsv阈值
import cv2
import numpy as np
from matplotlib import pyplot as plt
cap = cv2.VideoCapture(0)
while(1):
# 获得图片
ret, frame = cap.read()
# 展示图片
cv2.imshow("capture", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
# 存储图片
cv2.imwrite("red.jpg", frame)
break
当通过调用电脑摄像头,按q拍摄完之后,这时我们先读取到我们刚刚拍摄到的图片,然后模拟鼠标点击事件来获取来hsv指
image=cv2.imread('red.jpg')
HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
def getpos(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDOWN: #定义一个鼠标左键按下去的事件
print(HSV[y,x])
cv2.imshow("imageHSV",HSV)
cv2.imshow('image',image)
cv2.setMouseCallback("imageHSV",getpos)
cv2.waitKey(0)
这时通过获取到的阈值,我们可以得知,我们电脑摄像头红色的阈值的最高和最低
low_red = [2,100,100]
high_red = [4,255,255]
再通过准确的阈值大小来设定色层,最后识别多种颜色的小球,并且用不同的颜色把这些小球圈出来
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
ret = cap.set(3, 640) # 设置帧宽
ret = cap.set(4, 480) # 设置帧高
def camera(): # 检查摄像头是否正常启动
while True:
ret, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 转换为HSV空间
lower_green = np.array([65, 43, 46]) # 设定绿色的阈值下限
upper_green = np.array([80, 255, 255]) # 设定绿色的阈值上限
lower_blue = np.array([95, 43, 46]) # 设定蓝色的阈值下限
upper_blue = np.array([105, 255, 255]) # 设定蓝色的阈值上限
lower_red = np.array([2, 100, 100]) # 设定红色的阈值下限
upper_red = np.array([4, 255, 255]) # 设定红色的阈值上限
lower_yellow = np.array([20, 43, 46]) # 设定黄色阈值下限
upper_yellow = np.array([25, 255, 255]) # 设定黄色的阈值上限
lower_purple = np.array([130, 43, 46]) # 设定紫色的阈值下限
upper_purple = np.array([155, 255, 255]) # 设定紫色的阈值上限
#设定一个颜色层
mask = cv2.inRange(hsv,lower_green,upper_green)
mask2 = cv2.inRange(hsv,lower_blue,upper_blue)
mask3 = cv2.inRange(hsv, lower_purple, upper_purple)
mask4 = cv2.inRange(hsv, lower_red, upper_red)
mask5 = cv2.inRange(hsv, lower_yellow, upper_yellow)
#确定小球的框框
contourareas = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
contourareas2 = cv2.findContours(mask2.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
contourareas3 = cv2.findContours(mask3.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
contourareas4 = cv2.findContours(mask4.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
contourareas5 = cv2.findContours(mask5.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
if len(contourareas) >0:
#从最大的框框来确定小球的内切圆
circle = max(contourareas,key=cv2.contourArea)
#再从内切圆里面确定小球的圆心和半径
((x,y),z) = cv2.minEnclosingCircle(circle)
x = int(x)
y = int(y)
z = int(z)
print((x,y),'radius:%d' % z)
if z >25:
cv2.circle(frame,(x,y),z,(0,255,0),5)
if len(contourareas2) >0:
circle2 = max(contourareas2,key=cv2.contourArea)
((x2,y2),z2) = cv2.minEnclosingCircle(circle2)
x2 = int(x2)
y2 = int(y2)
z2 = int(z2)
print((x2,y2),'radius:%d' % z2)
if z2 >25:
cv2.circle(frame,(x2,y2),z2,(65,105,255),5)
if len(contourareas3) >0:
circle3 = max(contourareas3,key=cv2.contourArea)
((x3,y3),z3) = cv2.minEnclosingCircle(circle3)
x3 = int(x3)
y3 = int(y3)
z3 = int(z3)
print((x3,y3),'radius:%d' % z3)
if z3 >25:
cv2.circle(frame,(x3,y3),z3,(160,32,240),5)
if len(contourareas4) >0:
circle4 = max(contourareas4,key=cv2.contourArea)
((x4,y4),z4) = cv2.minEnclosingCircle(circle4)
x4 = int(x4)
y4 = int(y4)
z4 = int(z4)
print((x4,y4),'radius:%d' % z4)
if z4 >25:
cv2.circle(frame,(x4,y4),z4,(255,0,0),5)
if len(contourareas5) >0:
circle5 = max(contourareas5,key=cv2.contourArea)
((x5,y5),z5) = cv2.minEnclosingCircle(circle5)
x5 = int(x5)
y5 = int(y5)
z5 = int(z5)
print((x5,y5),'radius:%d' % z5)
if z5 >25:
cv2.circle(frame,(x5,y5),z5,(255,255,0),5)
cv2.imshow('camera',frame)
key = cv2.waitKey(1) & 0xff
if key == ord('q'):
break
if __name__ == '__main__':
camera()
`