import cv2
import numpy as np
frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(0)
cap.set(3, 640) # 가로설정
cap.set(4, 480) # 세로설정
cap.set(10, 150) #밝기 설정
myColors = [[0,150,129,104,255,255],
[133,56,0,159,156,255],
[57,76,0,100,255,255]]
myColorValues = [[51,153,255], ##BGR
[255,0,255],
[0,255,0]]
myPoints = []
def findColor(img, myColors, myColorValues):
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
count =0
newPoints = []
for color in myColors:
lower = np.array(myColors[0][0:3])
upper = np.array(myColors[0][3:6])
mask =cv2.inRange(imgHSV, lower, upper)
x,y = getContours(mask)
cv2.circle(imgResult,(x,y),10,myColorValues[count],cv2.FILLED)
if x !=0 and y!=0:
newPoints.append([x,y,count])
count +=1
# cv2.imshow("img", mask)
return newPoints
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)
print(area)
if area>500:
# cv2.drawContours(imgResult, cnt, -1, (255, 0, 0), 3)
peri = cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt,0.02*peri,True)
print(len(approx))
x , y, w, h = cv2.boundingRect(approx)
return x+w//2,y
def drawOnCanvas(myPoints, myCOlorValues):
for point in myPoints:
cv2.circle(imgResult,(point[0],point[1]),10,myColorValues[point[2]],cv2.FILLED)
while True:
# 이미지 캡쳐하기
# 이미지를 가져오고 그성공여부를 저장할 sccess변수 지정 true or False
success, img = cap.read()
imgResult = img.copy()
newPoints = findColor(img,myColors, myColorValues)
if len(newPoints)!=0:
for newP in newPoints:
myPoints.append(newP)
if len(myPoints)!=0:
drawOnCanvas(myPoints, myColorValues)
cv2.imshow("Result", imgResult)
if cv2.waitKey(1) & 0xFF == ord('q'):
break