提交 cfdcccae 编写于 作者: F feilong

添加一个光流跟踪

上级 38a19732
# 蚂蚁的轨迹
使用OpenCV光流分析,跟踪蚂蚁的轨迹
![](./ant_flow.jpg)
代码框架:
```python
import numpy as np
import cv2
if __name__ == '__main__':
cap = cv2.VideoCapture('ant.mp4')
# ShiTomasi 角点检测参数
feature_params = dict(
maxCorners=100,
qualityLevel=0.5,
minDistance=30,
blockSize=10
)
# Lucas Kanada 光流检测参数
lk_params = dict(
winSize=(15, 15),
maxLevel=2,
criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)
)
# 获取第一帧并发现角点
ret, last_current_frame = cap.read()
last_gray = cv2.cvtColor(last_current_frame, cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(last_gray, mask=None, **feature_params)
mask = np.zeros_like(last_current_frame)
color = np.random.randint(0, 255, (100, 3))
while (1):
ret, current_frame = cap.read()
if not ret:
break
current_gray = cv2.cvtColor(current_frame, cv2.COLOR_BGR2GRAY)
# TODO(You): 请在此编写光流跟踪和绘制代码
current_img = cv2.add(current_frame, mask)
cv2.imshow('current_img', current_img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
last_gray = current_gray.copy()
p0 = good_new.reshape(-1, 1, 2)
cv2.destroyAllWindows()
cap.release()
```
## 答案
```python
p1, st, err = cv2.calcOpticalFlowPyrLK(
last_gray, current_gray, p0, None, **lk_params)
good_new = p1[st == 1]
good_old = p0[st == 1]
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()
c, d = old.ravel()
a, b = int(a), int(b)
c, d = int(c), int(d)
mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)
current_frame = cv2.circle(
current_frame, (a, b), 5, color[i].tolist(), -1)
```
## 选项
### current_gray, last_gray顺序错误
```python
p1, st, err = cv2.calcOpticalFlowPyrLK(
current_gray, last_gray, p0, None, **lk_params)
good_new = p1[st == 1]
good_old = p0[st == 1]
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()
c, d = old.ravel()
a, b = int(a), int(b)
c, d = int(c), int(d)
mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)
current_frame = cv2.circle(
current_frame, (a, b), 5, color[i].tolist(), -1)
```
### a,b,c,d 没有转换整型
```python
p1, st, err = cv2.calcOpticalFlowPyrLK(
last_gray, current_gray, p0, None, **lk_params)
good_new = p1[st == 1]
good_old = p0[st == 1]
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()
c, d = old.ravel()
mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)
current_frame = cv2.circle(
current_frame, (a, b), 5, color[i].tolist(), -1)
```
### good_new 和 good_new 顺序错误
```python
p1, st, err = cv2.calcOpticalFlowPyrLK(
last_gray, current_gray, p0, None, **lk_params)
good_old = p1[st == 1]
good_new = p0[st == 1]
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()
c, d = old.ravel()
a, b = int(a), int(b)
c, d = int(c), int(d)
mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)
current_frame = cv2.circle(
current_frame, (a, b), 5, color[i].tolist(), -1)
```
import numpy as np
import cv2
if __name__ == '__main__':
cap = cv2.VideoCapture('ant.mp4')
# ShiTomasi 角点检测参数
feature_params = dict(
maxCorners=100,
qualityLevel=0.5,
minDistance=30,
blockSize=10
)
# Lucas Kanada 光流检测参数
lk_params = dict(
winSize=(15, 15),
maxLevel=2,
criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)
)
# 获取第一帧并发现角点
ret, last_current_frame = cap.read()
last_gray = cv2.cvtColor(last_current_frame, cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(last_gray, mask=None, **feature_params)
mask = np.zeros_like(last_current_frame)
color = np.random.randint(0, 255, (100, 3))
while (1):
ret, current_frame = cap.read()
if not ret:
break
current_gray = cv2.cvtColor(current_frame, cv2.COLOR_BGR2GRAY)
p1, st, err = cv2.calcOpticalFlowPyrLK(
last_gray, current_gray, p0, None, **lk_params)
good_new = p1[st == 1]
good_old = p0[st == 1]
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()
c, d = old.ravel()
a, b = int(a), int(b)
c, d = int(c), int(d)
mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)
current_frame = cv2.circle(
current_frame, (a, b), 5, color[i].tolist(), -1)
current_img = cv2.add(current_frame, mask)
cv2.imshow('current_img', current_img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
last_gray = current_gray.copy()
p0 = good_new.reshape(-1, 1, 2)
cv2.destroyAllWindows()
cap.release()
pre_commit~=2.16.0
GitPython~=3.1.24
\ No newline at end of file
GitPython~=3.1.24
filterpy==1.4.5
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册