TELLOで人の顔を追従したいです
現在,教育用小型ドローンを用いて人の顔を追従する機能の開発を行っております。
そこで,動画が時間遅れしたり,かくついてしまうのでいらないフレーム捨てる機能をつけたいのですが,フレームスキップをいれたところ以下のようなエラーがメッセージが発生しました。
発生している問題・エラーメッセージ
エラーメッセージ 'numpy.ndarray' object has no attribute 'time_base'
該当のソースコード
python
1import socket 2import threading 3 4import numpy 5import cv2 6import time 7from time import sleep 8 9 10 11 12face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 13 14 15event = threading.Event() 16videoWriter = False 17isVideo = False 18 19 20cap = cv2.VideoCapture(0) 21 22#------------------------------------------------------------ 23 24width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) 25height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) 26 27x = width//2 28y = height//3 29 30w = width//2 31h = height//2 32 33X = 200 34Y = 200 35 36W = 150 37H = 150 38 39dx = x - X 40dy = y - Y 41 42#------------------------------------------------------------ 43 44 45#UDPソケット生成 46sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 47sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 48sock.bind(("", 9000)) 49 50#TELLO_EDUにコマンドを送る関数 51tello_address = ("192.168.10.1", 8889) 52def send_command(msg): 53 print(msg) 54 msg = msg.encode(encoding="utf-8") 55 sock.sendto(msg, tello_address) 56 event.wait() 57 event.clear() 58 59 60#TELLO_EDUからのメッセージを受け取る関数 61def recv(): 62 while True: 63 try: 64 data, server = sock.recvfrom(1518) 65 print(data.decode(encoding="utf-8")) 66 event.set() 67 except Exception: 68 break 69recvThread = threading.Thread(target=recv) 70recvThread.start() 71 72 73 74def start_rec(): 75 global videoWriter 76 global isVideo 77 FOURCC = cv2.VideoWriter_fourcc(*"XVID") 78 FPS = 30.0 79 SIZE = (960, 720) 80 videoWriter = cv2.VideoWriter('video0122_1.avi', FOURCC, FPS, SIZE) 81 isVideo = True 82 print("rec...") 83 84 85def stop_rec(): 86 global isVideo 87 isVideo = False 88 videowriter.release() 89 #videoWriter.release() 90 91 92 print("...rec stop") 93 94 95 96 97 98def tracking(dx,dy): 99 100 dx = 0 101 dy = 0 102 103 if 5 < dx: 104 print('right') 105 send_command("right") 106 107 elif dx < -5: 108 print('left') 109 send_command("left") 110 111 else: 112 print("___ERROR___") 113 114 115 if dy > 5: 116 print('down') 117 send_command("down") 118 119 elif dy < 5: 120 print('up') 121 send_command("up") 122 123 else: 124 print("___ERROR___") 125 126 127 128 129 130def main(): 131 132 try: 133 send_command("command") 134 send_command("streamon") 135 start_rec() 136 send_command("takeoff") 137 138# skip first 300 frames 139 140 frame_skip = 300 141 142 cap = cv2.VideoCapture("udp://0.0.0.0:11111") 143 144 145 146 while True: 147 148 if 0 < frame_skip: 149 frame_skip = frame_skip - 1 150 continue 151 152 153 ret, frame = cap.read() 154 cv2.rectangle(frame, (X, Y), (X+W, Y+H), color=(0,0,255),thickness= 4) 155 156 157 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 158 faces = face_cascade.detectMultiScale(gray, 1.3, 5) 159 for (x,y,w,h) in faces: 160 cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) 161 roi_gray = gray[y:y+h, x:x+w] 162 roi_color = frame[y:y+h, x:x+w] 163 cv2.imshow('frame', frame) 164 165 if isVideo: 166 videoWriter.write(frame) 167 168 if cv2.waitKey(1) & 0xFF == ord('q'): 169 break 170 171 key = cv2.waitKey(1)&0xff 172 if key == ord("p"): 173 tracking(dx,dy) 174 175 if frame.time_base < 1.0/60: 176 time_base = 1.0/60 177 else: 178 time_base = frame.time_base 179 frame_skip = int((time.time() - start_time)/time_base) 180 181 182 183 184 if key == 27: 185 break 186 187 188 189 190 except Exception as ex: 191 print (ex) 192 193 finally: 194 cap.release() 195 cv2.destroyAllWindows() 196 send_command("streamoff") 197 sock.close() 198 print("--- END ---") 199 200if __name__ == "__main__": 201 main() 202 203ソースコード
試したこと
他にフレームスキップの方法がないか調べたのですがわかりませんでした。
また,このエラーメッセージが意味することは,numpyはndarrayという属性をもたないよをもたないよということのようなのですが,単にフレームスキップを入れる位置が悪いのかなという気がします。
補足情報(FW/ツールのバージョンなど)
開発環境は
---windows10
---python3.7.3
---Anaconda
です。
アドバイスいただけますでしょうか
よろしくお願いいたします
あなたの回答
tips
プレビュー