|
import cv2
import numpy as np
frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(0)
cap.set(3, frameWidth)
cap.set(4, frameHeight)
cap.set(10,150) #1.亮度
#myColors = [[160,124,110,179,255,255]]
#myColorValues = [[0,0,255]]
myColors = [[48,112,109,179,255,255],#蓝色
[133,56,0,159,156,255],#蓝色
[57,76,0,100,255,255],#紫色
[90,48,0,118,255,255]]#绿色
myColorValues = [[51,153,255], #橙色 ## BGR
[255,0,255],
#紫色
[0,255,0],
#绿色
[255,0,0]]
#4.定义计数器的列表
myPoints = [] ## [x , y , colorId ]
def findColor(img,myColors,myColorValues):#2.定义检测颜色函数
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)#颜色转变为hsv
count = 0
newPoints=[]#清空
for color in myColors:
lower = np.array(color[0:3])#for魂环,第一次遍历第一行的1-3列,第二次遍历第一行的1-3列
upper = np.array(color[3:6])#for魂环,第一次遍历第一行的3-6列,第二次遍历第一行的3-6列
mask = cv2.inRange(imgHSV,lower,upper)#使用mask 遮罩来使得所需要的颜色被保留,不需要的颜色就隐藏掉。 #图像与操作,使颜色变为彩色
#3.调用函数
x,y=getContours(mask)
cv2.circle(imgResult,(x,y),2,myColorValues[count],cv2.FILLED)#3.画圆圈(img.(中心点),(半径),(RGB
颜色)(线条的宽度))
#4.定义计数器
if x!=0 and y!=0:#4.
newPoints.append([x,y,count])
count +=1
#cv2.imshow(str(color[0]),mask)#字符串矩阵
#6.返回newPoints【x,y,count】
return newPoints
#3.给笔尖加颜色
def getContours(img):
contours,hierarchy =
cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
x,y,w,h = 0,0,0,0
for cnt in contours:
area = cv2.contourArea(cnt)
if area>500:#3.防止因为环境改变区域的大小
#cv2.drawContours(imgResult, cnt, -1, (255, 0, 0), 3) #
drawContours("图片src","轮廓list","指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。",颜色,线条厚度)
peri = cv2.arcLength(cnt,True)#图形的每条弧长,长度近似拐角即可获得 形状。cv2.arcLength() 计算得到。arcLength(轮廓list,True)True可以用来指定对象的形状是闭合的,还是打开的先
approx = cv2.approxPolyDP(cnt,0.02*peri,True) #面积计算轮廓的近似值参数说明:contour表示输入的轮廓值, length表示轮廓的大小, True表示是否闭合
x, y, w, h = cv2.boundingRect(approx) #获取边界的像素、宽度、高度
return x+w//2,y
#5给检测的笔尖画圆圈
def drawOnCanvas(myPoints,myColorValues):
for point
in myPoints:
#6画圆
cv2.circle(imgResult, (point[0], point[1]), 5,
myColorValues[point[2]], cv2.FILLED)#画圆圈(img.(中心点),(半径),(RGB
颜色)(线条的宽度))
while True:
success, img = cap.read() #1.读取提视频
imgResult = img.copy()
#4.计数器,返回x,y,count
newPoints = findColor(img, myColors,myColorValues)
if len(newPoints)!=0:
for newP
in newPoints:
myPoints.append(newP)
if len(myPoints)!=0:
# 6画圆
drawOnCanvas(myPoints,myColorValues)
cv2.imshow("Result", imgResult) #1.显示结果
if cv2.waitKey(1) & 0xFF == ord('q'): #获取键盘输入
break;
![]()
|