-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKLT20201116.html
431 lines (321 loc) · 34.3 KB
/
KLT20201116.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
<!DOCTYPE html>
<html lang=en>
<head>
<!-- so meta -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="HandheldFriendly" content="True">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5" />
<meta name="description" content="本文主要会讲解以下的几个部分: 0. 什么是光流 1. 光流法的基本约束方程 2. KLT算法的基本思想 3. 公式推导过程 4. opencv代码实现 5. 参考部分 希望能够通过这个算法一窥光流跟踪法的基本思想与原理。">
<meta property="og:type" content="article">
<meta property="og:title" content="KLT光流跟踪">
<meta property="og:url" content="https://tblgsn.github.io/KLT20201116.html">
<meta property="og:site_name" content="tblgsn的个人博客">
<meta property="og:description" content="本文主要会讲解以下的几个部分: 0. 什么是光流 1. 光流法的基本约束方程 2. KLT算法的基本思想 3. 公式推导过程 4. opencv代码实现 5. 参考部分 希望能够通过这个算法一窥光流跟踪法的基本思想与原理。">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="https://tblgsn.github.io/img/Opticalflow/feature_point_tracking.png?raw=true">
<meta property="og:image" content="https://tblgsn.github.io/img/Opticalflow/feature_point_tracking.png?raw=true">
<meta property="og:image" content="https://tblgsn.github.io/img/Opticalflow/d_residual_function.png?raw=true">
<meta property="article:published_time" content="2020-11-16T16:44:00.000Z">
<meta property="article:modified_time" content="2025-01-22T09:14:47.021Z">
<meta property="article:author" content="tblgsn">
<meta property="article:tag" content="KLT">
<meta property="article:tag" content="光流法">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://tblgsn.github.io/img/Opticalflow/feature_point_tracking.png?raw=true">
<link rel="shortcut icon" href="/images/favicon.ico">
<link rel="icon" type="image/png" href="/images/favicon-192x192.png" sizes="192x192">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png">
<!-- title -->
<title>KLT光流跟踪</title>
<!-- async scripts -->
<!-- Google Analytics -->
<!-- Umami Analytics -->
<!-- styles -->
<link rel="stylesheet" href="/css/style.css">
<!-- persian styles -->
<!-- rss -->
<link rel="alternate" href="/true" title="tblgsn的个人博客" type="application/atom+xml" />
<!-- mathjax -->
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'],
inlineMath: [['$','$']]
}
});
</script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML' async></script>
<meta name="generator" content="Hexo 7.0.0"></head>
<body class="max-width mx-auto px3 ltr">
<div id="header-post">
<a id="menu-icon" href="#" aria-label="Menu"><i class="fa-solid fa-bars fa-lg"></i></a>
<a id="menu-icon-tablet" href="#" aria-label="Menu"><i class="fa-solid fa-bars fa-lg"></i></a>
<a id="top-icon-tablet" href="#" aria-label="Top" onclick="$('html, body').animate({ scrollTop: 0 }, 'fast');" style="display:none;"><i class="fa-solid fa-chevron-up fa-lg"></i></a>
<span id="menu">
<span id="nav">
<ul>
<!--
--><li><a href="/">Home</a></li><!--
--><!--
--><li><a href="/archives/">Writing</a></li><!--
--><!--
--><li><a target="_blank" rel="noopener" href="http://github.com/tblgsn">Projects</a></li><!--
--><!--
--><li><a href="/about/">About</a></li><!--
-->
</ul>
</span>
<br/>
<span id="actions">
<ul>
<li><a class="icon" aria-label="Previous post" href="/Particlefilter20201209.html"><i class="fa-solid fa-chevron-left" aria-hidden="true" onmouseover="$('#i-prev').toggle();" onmouseout="$('#i-prev').toggle();"></i></a></li>
<li><a class="icon" aria-label="Next post" href="/InstallOpencv20201024.html"><i class="fa-solid fa-chevron-right" aria-hidden="true" onmouseover="$('#i-next').toggle();" onmouseout="$('#i-next').toggle();"></i></a></li>
<li><a class="icon" aria-label="Back to top" href="#" onclick="$('html, body').animate({ scrollTop: 0 }, 'fast');"><i class="fa-solid fa-chevron-up" aria-hidden="true" onmouseover="$('#i-top').toggle();" onmouseout="$('#i-top').toggle();"></i></a></li>
<li><a class="icon" aria-label="Share post" href="#"><i class="fa-solid fa-share-alt" aria-hidden="true" onmouseover="$('#i-share').toggle();" onmouseout="$('#i-share').toggle();" onclick="$('#share').toggle();return false;"></i></a></li>
</ul>
<span id="i-prev" class="info" style="display:none;">Previous post</span>
<span id="i-next" class="info" style="display:none;">Next post</span>
<span id="i-top" class="info" style="display:none;">Back to top</span>
<span id="i-share" class="info" style="display:none;">Share post</span>
</span>
<br/>
<div id="share" style="display: none">
<ul>
<li><a class="icon" target="_blank" rel="noopener" href="http://www.facebook.com/sharer.php?u=https://tblgsn.github.io/KLT20201116.html"><i class="fab fa-facebook " aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="https://twitter.com/share?url=https://tblgsn.github.io/KLT20201116.html&text=KLT光流跟踪"><i class="fab fa-twitter " aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="http://www.linkedin.com/shareArticle?url=https://tblgsn.github.io/KLT20201116.html&title=KLT光流跟踪"><i class="fab fa-linkedin " aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="https://pinterest.com/pin/create/bookmarklet/?url=https://tblgsn.github.io/KLT20201116.html&is_video=false&description=KLT光流跟踪"><i class="fab fa-pinterest " aria-hidden="true"></i></a></li>
<li><a class="icon" href="mailto:?subject=KLT光流跟踪&body=Check out this article: https://tblgsn.github.io/KLT20201116.html"><i class="fa-solid fa-envelope " aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="https://getpocket.com/save?url=https://tblgsn.github.io/KLT20201116.html&title=KLT光流跟踪"><i class="fab fa-get-pocket " aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="http://reddit.com/submit?url=https://tblgsn.github.io/KLT20201116.html&title=KLT光流跟踪"><i class="fab fa-reddit " aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="http://www.stumbleupon.com/submit?url=https://tblgsn.github.io/KLT20201116.html&title=KLT光流跟踪"><i class="fab fa-stumbleupon " aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="http://digg.com/submit?url=https://tblgsn.github.io/KLT20201116.html&title=KLT光流跟踪"><i class="fab fa-digg " aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="http://www.tumblr.com/share/link?url=https://tblgsn.github.io/KLT20201116.html&name=KLT光流跟踪&description=<p>本文主要会讲解以下的几个部分:</p>
<p><a href="#0.%E4%BB%80%E4%B9%88%E6%98%AF%E5%85%89%E6%B5%81">0. 什么是光流</a></p>
<p><a href="#1.%E5%85%89%E6%B5%81%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%BA%A6%E6%9D%9F%E6%96%B9%E7%A8%8B">1. 光流法的基本约束方程</a></p>
<p><a href="#2.KLT%E7%AE%97%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%80%9D%E6%83%B3">2. KLT算法的基本思想</a></p>
<p><a href="#3.%E5%85%AC%E5%BC%8F%E6%8E%A8%E5%AF%BC%E8%BF%87%E7%A8%8B">3. 公式推导过程</a></p>
<p><a href="#4.opencv%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0">4. opencv代码实现</a></p>
<p><a href="#5.%E5%8F%82%E8%80%83%E9%83%A8%E5%88%86">5. 参考部分</a></p>
<p>希望能够通过这个算法一窥光流跟踪法的基本思想与原理。<br><img src="/img/Opticalflow/feature_point_tracking.png?raw=true" alt="feature_points_tracking"></p>"><i class="fab fa-tumblr " aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="https://news.ycombinator.com/submitlink?u=https://tblgsn.github.io/KLT20201116.html&t=KLT光流跟踪"><i class="fab fa-hacker-news " aria-hidden="true"></i></a></li>
</ul>
</div>
<div id="toc">
<ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#0-%E4%BB%80%E4%B9%88%E6%98%AF%E5%85%89%E6%B5%81"><span class="toc-number">1.</span> <span class="toc-text">0. 什么是光流</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#1-%E5%85%89%E6%B5%81%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%BA%A6%E6%9D%9F%E6%96%B9%E7%A8%8B"><span class="toc-number">2.</span> <span class="toc-text">1.光流法的基本约束方程</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#2-KLT%E7%AE%97%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%80%9D%E6%83%B3"><span class="toc-number">3.</span> <span class="toc-text">2. KLT算法的基本思想</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#3-%E5%85%AC%E5%BC%8F%E6%8E%A8%E5%AF%BC%E8%BF%87%E7%A8%8B"><span class="toc-number">4.</span> <span class="toc-text">3. 公式推导过程</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#4-opencv%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0"><span class="toc-number">5.</span> <span class="toc-text">4. opencv代码实现</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#5-%E5%8F%82%E8%80%83"><span class="toc-number">6.</span> <span class="toc-text">5. 参考</span></a></li></ol>
</div>
</span>
</div>
<div class="content index py4 ">
<article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
<header>
<h1 class="posttitle p-name" itemprop="name headline">
KLT光流跟踪
</h1>
<div class="meta">
<span class="author p-author h-card" itemprop="author" itemscope itemtype="http://schema.org/Person">
<span class="p-name" itemprop="name">@TBLGSn</span>
</span>
<div class="postdate">
<time datetime="2020-11-16T16:44:00.000Z" class="dt-published" itemprop="datePublished">2020-11-16</time>
</div>
<div class="article-tag">
<i class="fa-solid fa-tag"></i>
<a class="p-category" href="/tags/KLT/" rel="tag">KLT</a>, <a class="p-category" href="/tags/%E5%85%89%E6%B5%81%E6%B3%95/" rel="tag">光流法</a>
</div>
</div>
</header>
<div class="content e-content" itemprop="articleBody">
<p>本文主要会讲解以下的几个部分:</p>
<p><a href="#0.%E4%BB%80%E4%B9%88%E6%98%AF%E5%85%89%E6%B5%81">0. 什么是光流</a></p>
<p><a href="#1.%E5%85%89%E6%B5%81%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%BA%A6%E6%9D%9F%E6%96%B9%E7%A8%8B">1. 光流法的基本约束方程</a></p>
<p><a href="#2.KLT%E7%AE%97%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%80%9D%E6%83%B3">2. KLT算法的基本思想</a></p>
<p><a href="#3.%E5%85%AC%E5%BC%8F%E6%8E%A8%E5%AF%BC%E8%BF%87%E7%A8%8B">3. 公式推导过程</a></p>
<p><a href="#4.opencv%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0">4. opencv代码实现</a></p>
<p><a href="#5.%E5%8F%82%E8%80%83%E9%83%A8%E5%88%86">5. 参考部分</a></p>
<p>希望能够通过这个算法一窥光流跟踪法的基本思想与原理。<br><img src="/img/Opticalflow/feature_point_tracking.png?raw=true" alt="feature_points_tracking"></p>
<span id="more"></span>
<p><a id="#0.什么是光流"><a></p>
<h1 id="0-什么是光流"><a href="#0-什么是光流" class="headerlink" title="0. 什么是光流"></a>0. 什么是光流</h1><p>光流(optical flow)是空间运动物体在观察成像平面上的像素运动的瞬时速度[4]。<br>光流( Optical Flow )的概念是Gibson在1950年首先提出来的,它是空间运动物体在观察成像平面上的<strong>像素</strong>运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。[0]</p>
<p><a id="1.光流法的基本约束方程"><a></p>
<h1 id="1-光流法的基本约束方程"><a href="#1-光流法的基本约束方程" class="headerlink" title="1.光流法的基本约束方程"></a>1.光流法的基本约束方程</h1><p>光流法的基本思想是跟踪图像中像素点的移动来进行对物体移动的跟踪,而这种跟踪是发生在图像的像素级别的。我们用$I(x,y,t)$ 来表示图像中处于t时刻点(x,y)处的灰度值,经过$d_t$时间的移动该点的位置发生了改变,那么此时该像素点的表达方式变为$I(x +d_x,y+d_y,t+d_t)$ (未发生较大的运动,x方向上移动了$d_x$,y方向上移动了$d_y$).<br>我们假设图像的亮度没有发生改变,则有:<br>$$I(x,y,t) = I(x +d_x,y+d_y,t+d_t) \tag{1}$$<br>将上式泰勒展开有:<br>$$<br>I(x,y,t)=I(x,y,t)+<br>\frac {\partial I} {\partial x} d_x +<br>\frac {\partial I} {\partial y} d_y +<br>\frac {\partial I} {\partial t} d_t +<br>\xi \tag{2}<br>$$</p>
<p>$\xi$表示高阶无穷小项,可以忽略不计。再将(2)代人(1)后同除dt,有<br>$$<br>\frac {\partial I} {\partial x} {\frac {d_x} {d_t}} +<br>\frac {\partial I} {\partial y} {\frac {d_y} {d_t}} +<br>\frac {\partial I} {\partial t} {\frac {d_t} {d_t}}<br>$$<br>进行符号替换有:<br>$$I_x u + I_yv +I_t = 0 \tag{3}$$</p>
<blockquote>
<p>(u,v)即为所求的光流矢量<br>式3被称为基本约束方程,如前文所述,这个方程成立有以下的两个条件:</p>
<ol>
<li>亮度恒定</li>
<li>时间连续或者是运动是“小运动”,相邻帧之间位移要比较小.</li>
</ol>
</blockquote>
<p><a id="2.KLT算法的基本思想"><a></p>
<h1 id="2-KLT算法的基本思想"><a href="#2-KLT算法的基本思想" class="headerlink" title="2. KLT算法的基本思想"></a>2. KLT算法的基本思想</h1><p>上面我们已经介绍了基本约束方程,等式(3)有两个未知量,需要引入其他的约束条件才能求解。<br>KLT算法就是光流法中<strong>基于梯度</strong>的一种方法,它通过增加假设<strong>空间一致,临近点有相似运动,保持相邻</strong>这一条件,来求解方程(3)进而求解出光流。<br>下面我们将通过学习KLT算法来探究这种像素级别的跟踪方式。</p>
<p><img src="/img/Opticalflow/feature_point_tracking.png?raw=true" alt="feature_points_tracking"></p>
<p>算法的基本思想是:通过跟踪连续的图像帧中特定的点达到跟踪的效果(这种同方向上移动的点总是有很多,且有相同的移动轨迹)。这种方法最大的问题是如何求解出第二帧中的对应的点,且要求相邻帧之间的移动不能太剧烈。</p>
<p>将上述思想抽象成具体的数学问题就是:</p>
<blockquote>
<p>“如何找到两个帧之间相似的点”</p>
</blockquote>
<p>我们用$I和J$ 来表示两个不同的帧,$I(x y)$和$J(x y)$来表示图片中$[x y]^T$坐标处的灰度值(gray value),使用$u = [u_x u_y]^T$来表示第一帧$[x, y]^T$坐标处中的点,使用$v = [v_x v_y]^T$来表示第二帧$[x y]^T$坐标处中的一点,此时上述问题就转变成:</p>
<blockquote>
<p>在第二帧中求解出一个$v$,使得$I(u)$和$J(v)$相近.</p>
</blockquote>
<p>我们用$d=[d_x d_y]^T$来记录中图片中$u$点处的速度(或者称其为$u$点处的光流),此时有:<br>$$v = u + d = [u_x+d_x u_y+d_y]^T$$</p>
<p>通过上面的式子,我们找到了一个求解第二帧对应点的方法,通过计算第一帧某点出的$d$(即,这点处的速度)即可找到第二帧中的该点的对应点。</p>
<p>$d$的求解问题请查看公式推导章节.</p>
<p><a id="3.公式推导过程"><a></p>
<h1 id="3-公式推导过程"><a href="#3-公式推导过程" class="headerlink" title="3. 公式推导过程"></a>3. 公式推导过程</h1><p>//TODO ???gray 与亮度的关系<br>我们假设亮度恒定(如上所述,我们是根据灰度值来寻找第二帧中移动后的点),我们假设t时刻某一个点(x y)在很短时间内移动后的坐标是$(x+d_x y+d_y)$。<br>定义如下的剩余函数(the residual function):<br>$$\xi(d) = \xi(d_x d_y) = \sum_{x=u_x-w_x}^{u_x+w_x}<br> \sum_{x=u_y-w_y}^{u_y+w_y}<br> (I(x,y) - J(x+d_x,y+d_y))^2$$</p>
<blockquote>
<ul>
<li>这个式子实际上表达的是:以两个点为中心,窗口大小为$(2w_x+1)*(w_y+1)$范围内灰度值的差。<br><img src="/img/Opticalflow/d_residual_function.png?raw=true" alt="d_residual_function"></li>
</ul>
</blockquote>
<p>此时我们的任务就是寻找这个函数的最小值,也就是寻找最下的$d$。<br>//TODO</p>
<blockquote>
<p>不难证明函数$\xi(d)$取最小点处的导数为零.</p>
</blockquote>
<p>上式求导数有:<br>$$<br>\frac{\partial \xi(d)}{\partial d} =<br>-2 \sum_{x=u_x-w_x}^{u_x+w_x}<br>\sum_{x=u_y-w_y}^{u_y+w_y}<br>(I(x,y) - J(x+d_x,y+d_y))<br>[\frac {\partial J} {\partial x}<br>\frac {\partial J} {\partial y}]<br>$$<br>将$J(x+d_x,y+d_y)$泰勒展开的:<br>$$\frac{\partial \xi(d)}{\partial d} ≈<br>-2 \sum_{x=u_x-w_x}^{u_x+w_x}<br>\sum_{x=u_y-w_y}^{u_y+w_y}<br>(I(x,y) - J(x,y) - [\frac {\partial J} {\partial x}<br>\frac {\partial J} {\partial y}] d)<br>[\frac {\partial J} {\partial x} \frac {\partial J} {\partial y}]<br>$$</p>
<blockquote>
<ul>
<li>$I(x,y)和J(x,y)表示的同一坐标处的灰度值$,记${\delta I} = I(x,y) - J(x,y)$</li>
<li>$[\frac {\partial J} {\partial x} \frac {\partial J} {\partial y}]$则是图像的梯度。(记为这个矩阵的转置为$\nabla I$)</li>
<li>又记$<br>I_x(x,y)=<br>{\frac {\partial I(x,y)}{\partial x}} =<br>{\frac {I(x+1,y) - I(x-1, y)} 2}<br>$,$<br>I_y(x,y)=<br>{\frac {\partial J(x,y)}{\partial x}} =<br>{\frac {I(x,y+1) - I(x,y-1)} 2}<br>$<br>($J_x(x,y)$和$J_y(x,y)$定义类似)</li>
</ul>
</blockquote>
<p>符号替换有:<br>$$<br>{\frac 1 2}\frac{\partial \xi(d)}{\partial d} ≈<br>\sum_{x=u_x-w_x}^{u_x+w_x}<br>\sum_{x=u_y-w_y}^{u_y+w_y}<br>({\nabla I^T}d - {\delta I}){\nabla I^T}<br>$$<br>又有:<br>$$<br>{\frac 1 2} [\frac{\partial \xi(d)}{\partial d}]^T ≈<br>\sum_{x=u_x-w_x}^{u_x+w_x}<br>\sum_{x=u_y-w_y}^{u_y+w_y}<br>(<br>[<br>\begin{matrix}<br>I^2_x & I_xI_y\<br>I_yI_y & I^2_y \<br>\end{matrix}<br>]d<br>-[\begin{matrix}<br>\delta I & I_x\<br>\delta I & I_y \<br>\end{matrix}]<br>)<br>$$<br>最后一次符号替换有:<br>$$<br>{\frac 1 2} [\frac{\partial \xi(d)}{\partial d}]^T<br>≈<br>Gd - \overline b<br>$$<br>令偏导数为零有:<br>$$d = G^{-1} \overline b$$</p>
<blockquote>
<p>d一定可逆</p>
</blockquote>
<p><a id="#4.opencv代码实现"><a></p>
<h1 id="4-opencv代码实现"><a href="#4-opencv代码实现" class="headerlink" title="4. opencv代码实现"></a>4. opencv代码实现</h1><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">Mat mask = Mat::<span class="built_in">zeros</span>(currentFrame.<span class="built_in">size</span>(), currentFrame.<span class="built_in">type</span>());</span><br><span class="line"></span><br><span class="line"><span class="comment">//当前与下一个灰度图像</span></span><br><span class="line">cv::Mat currentgrayImg, nextgrayImg;</span><br><span class="line"><span class="built_in">cvtColor</span>(currentFrame, currentgrayImg, COLOR_BGRA2GRAY);</span><br><span class="line"><span class="built_in">cvtColor</span>(nextframe, nextgrayImg, COLOR_BGRA2GRAY);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 得到“好的跟踪点”</span></span><br><span class="line">vector<Point2f> p0, p1; </span><br><span class="line">cv::<span class="built_in">goodFeaturesToTrack</span>(currentgrayImg, p0, <span class="number">10</span>, <span class="number">0.3</span>,</span><br><span class="line"> <span class="number">7</span>,<span class="built_in">Mat</span>(), <span class="number">7</span>,<span class="literal">false</span>,<span class="number">0.04</span>);</span><br><span class="line"></span><br><span class="line">vector<uchar> status;</span><br><span class="line">vector<<span class="type">float</span>> err;</span><br><span class="line"></span><br><span class="line">TermCriteria criteria = <span class="built_in">TermCriteria</span>((TermCriteria::COUNT) + (TermCriteria::EPS), <span class="number">10</span>, <span class="number">0.03</span>);</span><br><span class="line"><span class="built_in">calcOpticalFlowPyrLK</span>(currentgrayImg, nextgrayImg, p0, p1, status, err, <span class="built_in">Size</span>(<span class="number">15</span>,<span class="number">15</span>), <span class="number">2</span>, criteria);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 可视化</span></span><br><span class="line">Mat img;</span><br><span class="line">vector<Scalar> colors;</span><br><span class="line">RNG rng;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i < <span class="number">100</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="type">int</span> r = rng.<span class="built_in">uniform</span>(<span class="number">0</span>, <span class="number">256</span>);</span><br><span class="line"><span class="type">int</span> g = rng.<span class="built_in">uniform</span>(<span class="number">0</span>, <span class="number">256</span>);</span><br><span class="line"><span class="type">int</span> b = rng.<span class="built_in">uniform</span>(<span class="number">0</span>, <span class="number">256</span>);</span><br><span class="line">colors.<span class="built_in">push_back</span>(<span class="built_in">Scalar</span>(r,g,b));</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span>(uint i = <span class="number">0</span>; i < p0.<span class="built_in">size</span>(); i++) {</span><br><span class="line"><span class="built_in">line</span>(mask,p1[i], p0[i], colors[i], <span class="number">2</span>);</span><br><span class="line"><span class="comment">//,circle(currentFrame, p1[i], 5, colors[i], -1);</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="built_in">add</span>(currentFrame, mask, img); </span><br><span class="line"><span class="built_in">imshow</span>(<span class="string">"Frame"</span>, img);</span><br><span class="line">cv::<span class="built_in">waitKey</span>(<span class="number">100</span>);</span><br></pre></td></tr></table></figure>
<p><a id="5.参考"><a></p>
<h1 id="5-参考"><a href="#5-参考" class="headerlink" title="5. 参考"></a>5. 参考</h1><ul>
<li><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/88033287">0 (三十八)稀疏光流—-KLT</a></li>
<li><a target="_blank" rel="noopener" href="https://web.yonsei.ac.kr/jksuhr/articles/Kanade-Lucas-Tomasi%20Tracker.pdf">1 Kanade-Lucas-Tomasi (KLT) Feature Tracker</a></li>
<li><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/91341439?from_voters_page=true">2 KLT目标跟踪学习与代码实现</a></li>
<li><a target="_blank" rel="noopener" href="https://www.cnblogs.com/moondark/archive/2012/05/12/2497391.html">3 Kanade-Lucas-Tomasi(KLT)进行目标跟踪</a></li>
<li><a target="_blank" rel="noopener" href="https://blog.csdn.net/qq_41368247/article/details/82562165">4 计算机视觉–光流法(optical flow)简介</a></li>
</ul>
</div>
</article>
<div class="blog-post-comments">
<div id="utterances_thread">
<noscript>Please enable JavaScript to view the comments.</noscript>
</div>
</div>
<div id="footer-post-container">
<div id="footer-post">
<div id="nav-footer" style="display: none">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/archives/">Writing</a></li>
<li><a target="_blank" rel="noopener" href="http://github.com/tblgsn">Projects</a></li>
<li><a href="/about/">About</a></li>
</ul>
</div>
<div id="toc-footer" style="display: none">
<ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#0-%E4%BB%80%E4%B9%88%E6%98%AF%E5%85%89%E6%B5%81"><span class="toc-number">1.</span> <span class="toc-text">0. 什么是光流</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#1-%E5%85%89%E6%B5%81%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%BA%A6%E6%9D%9F%E6%96%B9%E7%A8%8B"><span class="toc-number">2.</span> <span class="toc-text">1.光流法的基本约束方程</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#2-KLT%E7%AE%97%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%80%9D%E6%83%B3"><span class="toc-number">3.</span> <span class="toc-text">2. KLT算法的基本思想</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#3-%E5%85%AC%E5%BC%8F%E6%8E%A8%E5%AF%BC%E8%BF%87%E7%A8%8B"><span class="toc-number">4.</span> <span class="toc-text">3. 公式推导过程</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#4-opencv%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0"><span class="toc-number">5.</span> <span class="toc-text">4. opencv代码实现</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#5-%E5%8F%82%E8%80%83"><span class="toc-number">6.</span> <span class="toc-text">5. 参考</span></a></li></ol>
</div>
<div id="share-footer" style="display: none">
<ul>
<li><a class="icon" target="_blank" rel="noopener" href="http://www.facebook.com/sharer.php?u=https://tblgsn.github.io/KLT20201116.html"><i class="fab fa-facebook fa-lg" aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="https://twitter.com/share?url=https://tblgsn.github.io/KLT20201116.html&text=KLT光流跟踪"><i class="fab fa-twitter fa-lg" aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="http://www.linkedin.com/shareArticle?url=https://tblgsn.github.io/KLT20201116.html&title=KLT光流跟踪"><i class="fab fa-linkedin fa-lg" aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="https://pinterest.com/pin/create/bookmarklet/?url=https://tblgsn.github.io/KLT20201116.html&is_video=false&description=KLT光流跟踪"><i class="fab fa-pinterest fa-lg" aria-hidden="true"></i></a></li>
<li><a class="icon" href="mailto:?subject=KLT光流跟踪&body=Check out this article: https://tblgsn.github.io/KLT20201116.html"><i class="fa-solid fa-envelope fa-lg" aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="https://getpocket.com/save?url=https://tblgsn.github.io/KLT20201116.html&title=KLT光流跟踪"><i class="fab fa-get-pocket fa-lg" aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="http://reddit.com/submit?url=https://tblgsn.github.io/KLT20201116.html&title=KLT光流跟踪"><i class="fab fa-reddit fa-lg" aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="http://www.stumbleupon.com/submit?url=https://tblgsn.github.io/KLT20201116.html&title=KLT光流跟踪"><i class="fab fa-stumbleupon fa-lg" aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="http://digg.com/submit?url=https://tblgsn.github.io/KLT20201116.html&title=KLT光流跟踪"><i class="fab fa-digg fa-lg" aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="http://www.tumblr.com/share/link?url=https://tblgsn.github.io/KLT20201116.html&name=KLT光流跟踪&description=<p>本文主要会讲解以下的几个部分:</p>
<p><a href="#0.%E4%BB%80%E4%B9%88%E6%98%AF%E5%85%89%E6%B5%81">0. 什么是光流</a></p>
<p><a href="#1.%E5%85%89%E6%B5%81%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%BA%A6%E6%9D%9F%E6%96%B9%E7%A8%8B">1. 光流法的基本约束方程</a></p>
<p><a href="#2.KLT%E7%AE%97%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%80%9D%E6%83%B3">2. KLT算法的基本思想</a></p>
<p><a href="#3.%E5%85%AC%E5%BC%8F%E6%8E%A8%E5%AF%BC%E8%BF%87%E7%A8%8B">3. 公式推导过程</a></p>
<p><a href="#4.opencv%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0">4. opencv代码实现</a></p>
<p><a href="#5.%E5%8F%82%E8%80%83%E9%83%A8%E5%88%86">5. 参考部分</a></p>
<p>希望能够通过这个算法一窥光流跟踪法的基本思想与原理。<br><img src="/img/Opticalflow/feature_point_tracking.png?raw=true" alt="feature_points_tracking"></p>"><i class="fab fa-tumblr fa-lg" aria-hidden="true"></i></a></li>
<li><a class="icon" target="_blank" rel="noopener" href="https://news.ycombinator.com/submitlink?u=https://tblgsn.github.io/KLT20201116.html&t=KLT光流跟踪"><i class="fab fa-hacker-news fa-lg" aria-hidden="true"></i></a></li>
</ul>
</div>
<div id="actions-footer">
<a id="menu" class="icon" href="#" onclick="$('#nav-footer').toggle();return false;"><i class="fa-solid fa-bars fa-lg" aria-hidden="true"></i> Menu</a>
<a id="toc" class="icon" href="#" onclick="$('#toc-footer').toggle();return false;"><i class="fa-solid fa-list fa-lg" aria-hidden="true"></i> TOC</a>
<a id="share" class="icon" href="#" onclick="$('#share-footer').toggle();return false;"><i class="fa-solid fa-share-alt fa-lg" aria-hidden="true"></i> Share</a>
<a id="top" style="display:none" class="icon" href="#" onclick="$('html, body').animate({ scrollTop: 0 }, 'fast');"><i class="fa-solid fa-chevron-up fa-lg" aria-hidden="true"></i> Top</a>
</div>
</div>
</div>
<footer id="footer">
<div class="footer-left">
Copyright ©
2019-2025
tblgsn
</div>
<div class="footer-right">
<nav>
<ul>
<!--
--><li><a href="/">Home</a></li><!--
--><!--
--><li><a href="/archives/">Writing</a></li><!--
--><!--
--><li><a target="_blank" rel="noopener" href="http://github.com/tblgsn">Projects</a></li><!--
--><!--
--><li><a href="/about/">About</a></li><!--
-->
</ul>
</nav>
</div>
</footer>
</div>
<!-- styles -->
<link rel="preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" crossorigin="anonymous" onload="this.onload=null;this.rel='stylesheet'"/>
<!-- jquery -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" crossorigin="anonymous"></script>
<!-- clipboard -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.7/clipboard.min.js" crossorigin="anonymous"></script>
<script type="text/javascript">
$(function() {
// copy-btn HTML
var btn = "<span class=\"btn-copy tooltipped tooltipped-sw\" aria-label=\"Copy to clipboard!\">";
btn += '<i class="fa-regular fa-clone"></i>';
btn += '</span>';
// mount it!
$(".highlight table").before(btn);
var clip = new ClipboardJS('.btn-copy', {
text: function(trigger) {
return Array.from(trigger.nextElementSibling.querySelectorAll('.code')).reduce((str,it)=>str+it.innerText+'\n','')
}
});
clip.on('success', function(e) {
e.trigger.setAttribute('aria-label', "Copied!");
e.clearSelection();
})
})
</script>
<script src="/js/main.js"></script>
<!-- search -->
<!-- Baidu Analytics -->
<!-- Cloudflare Analytics -->
<!-- Disqus Comments -->
<!-- utterances Comments -->
<script type="text/javascript">
var utterances_repo = 'TBLGSn/tblgsn.github.io';
var utterances_issue_term = 'url';
var utterances_label = 'Comment';
var utterances_theme = 'github-dark';
(function(){
var script = document.createElement('script');
script.src = 'https://utteranc.es/client.js';
script.setAttribute('repo', utterances_repo);
script.setAttribute('issue-term', 'pathname');
script.setAttribute('label', utterances_label);
script.setAttribute('theme', utterances_theme);
script.setAttribute('crossorigin', 'anonymous');
script.async = true;
(document.getElementById('utterances_thread')).appendChild(script);
}());
</script>
</body>
</html>