質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

1247閲覧

TELLOで人の顔を追従する機能開発でのフレームスキップの方法を教えてください

51633

総合スコア5

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/01/24 02:47

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
です。

アドバイスいただけますでしょうか
よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問