現状
pythonでオプティカルフローを使用しています。
様々なサイトのサンプルコードを使用させてもらって実験をしているのですが、画面に新しく入ってきた物体の検知ができません。
どこがおかしいのか、ご教示いただけると幸いです。
問題点
最初から画面に映っていた物体の検知はできますが、動画の途中から新しく入ってきた物体の検知ができません。
python
1import cv2 2import numpy as np 3 4 5input_file = 'input.mp4' 6output_file = 'output.mp4' 7cap = cv2.VideoCapture(input_file) 8 9width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) 10height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) 11fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') 12fps = int(cap.get(cv2.CAP_PROP_FPS)) 13writer = cv2.VideoWriter(output_file, fourcc, fps, (width, height)) 14 15# Shi-Tomasiのコーナー検出パラメータ 16feature_params = dict( maxCorners = 100, 17 qualityLevel = 0.3, 18 minDistance = 20, 19 blockSize = 20, 20 ) 21 22# Lucas-Kanade法のパラメータ 23lk_params = dict( winSize = (15,15), 24 maxLevel = 2, 25 criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) 26 27# ランダムに色を100個生成(値0~255の範囲で100行3列のランダムなndarrayを生成) 28color = np.random.randint(0, 255, (100, 3)) 29 30# 最初のフレームの処理 31end_flag, frame = cap.read() 32gray_prev = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 33feature_prev = cv2.goodFeaturesToTrack(gray_prev, mask = None, **feature_params) 34mask = np.zeros_like(frame) 35 36while(end_flag): 37 # グレースケールに変換 38 gray_next = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 39 40 # オプティカルフロー検出 41 feature_next, status, err = cv2.calcOpticalFlowPyrLK(gray_prev, gray_next, feature_prev, None, **lk_params) 42 43 # オプティカルフローを検出した特徴点を選別(0:検出せず、1:検出した) 44 good_prev = feature_prev[status == 1] 45 good_next = feature_next[status == 1] 46 47 # オプティカルフローを描画 48 for i, (next_point, prev_point) in enumerate(zip(good_next, good_prev)): 49 prev_x, prev_y = prev_point.ravel() 50 next_x, next_y = next_point.ravel() 51 ans = cv2.norm(next_point - prev_point); 52 mask = cv2.line(mask, (next_x, next_y), (prev_x, prev_y), color[i].tolist(), 2) 53 frame = cv2.line(frame, (int(width/2), 0), (int(width/2), int(height)), (255, 255, 255), thickness=1, lineType=cv2.LINE_4) 54 img = cv2.add(frame, mask) 55 56 gray_prev = gray_next.copy() 57 feature_prev = good_next.reshape(-1, 1, 2) 58 #feature_prev = cv2.goodFeaturesToTrack(gray_next, mask = None, **feature_params) 59 end_flag, frame = cap.read() 60 61 writer.write(img) 62 63writer.release() 64cap.release()
試したこと
上記コードのwhile文の最後の方の
feature_prev = good_next.reshape(-1, 1, 2)
を以下に変更すると新しく動画に入ってきたものを検知できますが、連続した特徴点が取れなくなってしまいます。
feature_prev = cv2.goodFeaturesToTrack(gray_next, mask = None, **feature_params)
行いたいこと
Frameごとに異なる特徴点ではなく、連続した特徴点で物体検知をしたいのですが、どのようにすれば良いでしょうか?
ご教示いただけますと幸いです。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/22 01:41
2021/03/22 01:47
2021/03/22 01:56
2021/03/22 01:58
2021/03/22 02:09
2021/03/22 02:19
2021/03/22 02:49