Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
CSDN 技术社区
skill_tree_opencv
提交
cfdcccae
S
skill_tree_opencv
项目概览
CSDN 技术社区
/
skill_tree_opencv
通知
65
Star
9
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
2
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
skill_tree_opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
2
Issue
2
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
cfdcccae
编写于
12月 16, 2021
作者:
F
feilong
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
添加一个光流跟踪
上级
38a19732
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
204 addition
and
1 deletion
+204
-1
data/1.OpenCV初阶/6.视频分析/1.光流/ant.mp4
data/1.OpenCV初阶/6.视频分析/1.光流/ant.mp4
+0
-0
data/1.OpenCV初阶/6.视频分析/1.光流/ant_flow.jpg
data/1.OpenCV初阶/6.视频分析/1.光流/ant_flow.jpg
+0
-0
data/1.OpenCV初阶/6.视频分析/1.光流/ant_flow_2.png
data/1.OpenCV初阶/6.视频分析/1.光流/ant_flow_2.png
+0
-0
data/1.OpenCV初阶/6.视频分析/1.光流/flow.md
data/1.OpenCV初阶/6.视频分析/1.光流/flow.md
+138
-0
data/1.OpenCV初阶/6.视频分析/1.光流/flow.py
data/1.OpenCV初阶/6.视频分析/1.光流/flow.py
+64
-0
requirement.txt
requirement.txt
+2
-1
未找到文件。
data/1.OpenCV初阶/6.视频分析/1.光流/ant.mp4
0 → 100644
浏览文件 @
cfdcccae
文件已添加
data/1.OpenCV初阶/6.视频分析/1.光流/ant_flow.jpg
0 → 100644
浏览文件 @
cfdcccae
146.0 KB
data/1.OpenCV初阶/6.视频分析/1.光流/ant_flow_2.png
0 → 100644
浏览文件 @
cfdcccae
1.1 MB
data/1.OpenCV初阶/6.视频分析/1.光流/flow.md
0 → 100644
浏览文件 @
cfdcccae
# 蚂蚁的轨迹
使用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
)
```
data/1.OpenCV初阶/6.视频分析/1.光流/flow.py
0 → 100644
浏览文件 @
cfdcccae
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
()
requirement.txt
浏览文件 @
cfdcccae
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录