-Premier poste- Ravi de vous rencontrer, je suis actuellement en quatrième année d'université. Je développe une fonction de tracking avec TELLO (même si ce n'est pas si bon ...). La spécialité du professeur responsable est le système de circuits électroniques, et je suis débordé sans entendre parler du programme. Il y a certains points qui ne peuvent pas être atteints, mais veuillez aider.
-Environnement de développement- ---windows10 ---python
-Contenu de la programmation-
import socket import threading import cv2 import numpy as np
event = threading.Event()
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
X = width//2 Y = height//3
W = width//2 H = height//2
x = width//2 y = height//3
w = width//2 h = height//2
gain_vx = 3 gain_vy = 3
gain_bf = 0.0022
gain_x_1 = 0.15 gain_y_1 = 0.1
gain_x_2 = 0.0003 gain_y_2 = 0.00005
dx = X - x dy = Y - y
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) sock.bind(("", 9000))
tello_address = ("192.168.10.1", 8889)
def send_command(msg): print(msg) msg = msg.encode(encoding="utf-8") sock.sendto(msg, tello_address) event.wait() event.clear()
def recv(): while True: try: data, server = sock.recvfrom(1518) print(data.decode(encoding="utf-8")) event.set() except Exception: break recvThread = threading.Thread(target=recv) recvThread.start()
def tracking(dx,dy,vx,vy):
if 5 < dx <= 150:
print('right')
drone.right(gain_x_1*dx + gain_vx*vx)
if -150 <= dx < -5:
print('left')
drone.left(- gain_x_1*dx - gain_vx*vx)
if dx > 150:
print('right')
drone.right(gain_x_2*dx*dx + gain_vx*vx/2)
if dx < -150:
print('left')
drone.left(gain_x_2*dx*dx - gain_vx*vx/2)
if dy > 5:
print('down')
drone.down(gain_y_2*dy*dy + gain_vy*vy/2)
if dy < 5:
print('up')
drone.up(gain_y_2*dy*dy + gain_vy*vy/2)
else:
print("___ERROR___")
def main(): try: send_command("command") send_command("streamon") send_command("takeoff")
cap = cv2.VideoCapture("udp://0.0.0.0:11111")
while True:
ret, img = cap.read()
cv2.rectangle(img, (X, Y), (X+W, Y+H), color=(0,0,255),thickness= 4)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
cv2.imshow('img', img)
tracking(dx,dy,vx,vy)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
except Exception as ex:
print (ex)
finally:
cap.release()
cv2.destroyAllWindows()
send_command("streamoff")
sock.close()
print("--- END ---")
if name == "main": main()
-Points qui ne fonctionnent pas- ① Où est-il approprié si le saut de trame est inclus? ➁ Est-ce un problème avant le saut d'image en premier lieu?
Je vous remercie.
-Le site que j'ai utilisé comme référence- https://atsblog.org/tello_tracking_camshift/ http://totech.hateblo.jp/entry/2017/10/22/100726