Итак, в видео группы людей мой код будет следить/отслеживать одного человека, идентифицируя цвет его футболки, а затем следовать за ним.
Теперь я хочу добавить новую функцию, по которой я смогу щелкнуть и вручную выбрать человека, которому я хочу, чтобы мой код следовал.
Итак, , если я хочу изменить человека, на которого буду подписываться вручную, щелкнув другого человека с футболкой другого цвета, мой код должен подписаться на этого человека, которого я выбрал.
Это это мой код:
Код: Выделить всё
import cv2
import numpy as np
import time
import matplotlib.pyplot as plt
from gtts import gTTS
import string
import speech_recognition as sr
r = sr.Recognizer()
m = sr.Microphone()
test=1
def checkspeech(r):
with sr.Microphone() as source:
audio = r.listen(source)
try:
print("You said: " + r.recognize_google(audio))
return (r.recognize_google(audio))
except sr.UnknownValueError:
print("Could not understand audio")
return ("WW")
except sr.RequestError as e:
print("Could not request results; {0}".format(e))
return ("WW")
while (test==0):
r.pause_threshold = 0.7
r.energy_threshold =1700
with m as source:
#r.adjust_for_ambient_noise(source)
print("Set minimum energy threshold to {}".format(r.energy_threshold))
print("MICROPHONE")
speech=str(checkspeech(r))
print(speech)
if (speech=="Follow me" or speech=="follow me" ):
test=1
print("Following")
else:
test=0
#speech3=speech.split(' ',1)[0]
drawing = False
ix,iy = -1,-1
R1=0
G1=0
B1=0
b=0
g=0
r=0
set1=0
cx1=0
cy1=0
time1 = time.time()
time2=0
a=0
cap=cv2.VideoCapture(0)
if (test==1):
while(cap.isOpened()):
ret,frame = cap.read()
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2HLS)
#cv2.imshow("frames",frame)
if(set1==0):
left = 280
right = 360
bottom = 280
top = 200
kernel = frame[top:bottom,left:right]
b,g,r,_=np.uint8(cv2.mean(kernel))
lb=b-30
ub=b+30
lg=g-30
ug=g+30
lr=r-30
ur=r+30
lower_blue = np.array([lb,lg,lr])
upper_blue = np.array([ub,ug,ur])
mask = cv2.inRange(frame, lower_blue, upper_blue)
dilation = cv2.dilate(mask,(5,5),iterations = 1)
erosion = cv2.dilate(dilation,(7,7),iterations = 1)
ret,cnts,heirarchy=cv2.findContours(erosion.astype(np.uint8),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
set1=1
#cv2.imshow('kernel',kernel)
mask1 = np.zeros_like(frame)
if(a==1):
#print(frame.shape[0])
#print(mask1.shape[0])
#print(frame.shape[1])
#print(mask1.shape[1])
lroi = cx - 150
rroi = cx + 150
broi = cy + 150
troi = cy - 150
if(lroi640):
rroi=640
if(broi>480):
broi=480
if(troi=0.5):
left = cx - 30
right = cx + 30
bottom = cy + 30
top = cy - 30
a=1
kernel = frame[top:bottom,left:right]
b,g,r,_=np.uint8(cv2.mean(kernel))
lb = b-40
ub=b+40
lg=g-40
ug=g+40
lr=r-40
ur=r+40
time1=time2
print(lb)
#cv2.drawContours(frame, approx, -1, (0,255,0), 3)
res = cv2.bitwise_and(frame,frame, mask = mask)
cv2.imshow('tester',frame)
cv2.imshow('tester1',dilation)
k = cv2.waitKey(1)
if (k==ord('q')):
break
cap.release()
cv2.destroyAllWindows()
Спасибо!Я выполнил следующие шаги:
Определите функцию обратного вызова мыши, которая будет захватывать событие щелчка мыши и записывать координаты щелчка.
Используйте координаты, полученные в результате щелчка мыши, чтобы определить начальную область интереса (ROI), где находится человек, которого нужно отслеживать.
Измените код, чтобы использовать эту область интереса, выбранную вручную. для калибровки цвета и обнаружения футболок.
Но это не сработало, возможно, мой код был неправильным или мой подход был неправильным.
Подробнее здесь: https://stackoverflow.com/questions/781 ... -selecting