简介

  本篇讲解使用opencv提供的流光法算法接口,实现物体跟踪。范例代码为参考修改tvl1_optical_flow.cpp实现。

具体实现

实现代码

<span class="co2" style="color: rgb(51, 153, 51);">#include <iostream></span>
<span class="co2" style="color: rgb(51, 153, 51);">#include <fstream></span><span class="co2" style="color: rgb(51, 153, 51);">#include "opencv2/video/tracking.hpp"</span>
<span class="co2" style="color: rgb(51, 153, 51);">#include "opencv2/highgui/highgui.hpp"</span>using namespace cv<span class="sy0" style="color: rgb(51, 153, 51);">;</span>
using namespace std<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw2" style="font-weight: bold;">inline</span> bool isFlowCorrect<span class="br0" style="color: rgb(0, 153, 0);">(</span>Point2f u<span class="br0" style="color: rgb(0, 153, 0);">)</span>
<span class="br0" style="color: rgb(0, 153, 0);">{</span><span class="kw1" style="color: rgb(177, 177, 0);">return</span> <span class="sy0" style="color: rgb(51, 153, 51);">!</span>cvIsNaN<span class="br0" style="color: rgb(0, 153, 0);">(</span>u.<span class="me1" style="color: rgb(32, 32, 32);">x</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">&&</span> <span class="sy0" style="color: rgb(51, 153, 51);">!</span>cvIsNaN<span class="br0" style="color: rgb(0, 153, 0);">(</span>u.<span class="me1" style="color: rgb(32, 32, 32);">y</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">&&</span> <span class="kw3" style="color: rgb(0, 0, 102);">fabs</span><span class="br0" style="color: rgb(0, 153, 0);">(</span>u.<span class="me1" style="color: rgb(32, 32, 32);">y</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);"><</span> <span class="nu19" style="color: rgb(128, 0, 128);">1e9</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>
<span class="br0" style="color: rgb(0, 153, 0);">}</span><span class="kw4" style="color: rgb(153, 51, 51);">static</span> Vec3b computeColor<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">float</span> fx<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="kw4" style="color: rgb(153, 51, 51);">float</span> fy<span class="br0" style="color: rgb(0, 153, 0);">)</span>
<span class="br0" style="color: rgb(0, 153, 0);">{</span><span class="kw4" style="color: rgb(153, 51, 51);">static</span> bool first <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="kw2" style="font-weight: bold;">true</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="co1" style="color: rgb(102, 102, 102); font-style: italic;">// relative lengths of color transitions:</span><span class="co1" style="color: rgb(102, 102, 102); font-style: italic;">// these are chosen based on perceptual similarity</span><span class="co1" style="color: rgb(102, 102, 102); font-style: italic;">// (e.g. one can distinguish more shades between red and yellow</span><span class="co1" style="color: rgb(102, 102, 102); font-style: italic;">//  than between yellow and green)</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">int</span> RY <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">15</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">int</span> YG <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">6</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">int</span> GC <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">4</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">int</span> CB <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">11</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">int</span> BM <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">13</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">int</span> MR <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">6</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">int</span> NCOLS <span class="sy0" style="color: rgb(51, 153, 51);">=</span> RY <span class="sy0" style="color: rgb(51, 153, 51);">+</span> YG <span class="sy0" style="color: rgb(51, 153, 51);">+</span> GC <span class="sy0" style="color: rgb(51, 153, 51);">+</span> CB <span class="sy0" style="color: rgb(51, 153, 51);">+</span> BM <span class="sy0" style="color: rgb(51, 153, 51);">+</span> MR<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">static</span> Vec3i colorWheel<span class="br0" style="color: rgb(0, 153, 0);">[</span>NCOLS<span class="br0" style="color: rgb(0, 153, 0);">]</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">if</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span>first<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> k <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">for</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> i <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> i <span class="sy0" style="color: rgb(51, 153, 51);"><</span> RY<span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>i<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>k<span class="br0" style="color: rgb(0, 153, 0);">)</span>colorWheel<span class="br0" style="color: rgb(0, 153, 0);">[</span>k<span class="br0" style="color: rgb(0, 153, 0);">]</span> <span class="sy0" style="color: rgb(51, 153, 51);">=</span> Vec3i<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">255</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span> <span class="sy0" style="color: rgb(51, 153, 51);">*</span> i <span class="sy0" style="color: rgb(51, 153, 51);">/</span> RY<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">for</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> i <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> i <span class="sy0" style="color: rgb(51, 153, 51);"><</span> YG<span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>i<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>k<span class="br0" style="color: rgb(0, 153, 0);">)</span>colorWheel<span class="br0" style="color: rgb(0, 153, 0);">[</span>k<span class="br0" style="color: rgb(0, 153, 0);">]</span> <span class="sy0" style="color: rgb(51, 153, 51);">=</span> Vec3i<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">255</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span> <span class="sy0" style="color: rgb(51, 153, 51);">*</span> i <span class="sy0" style="color: rgb(51, 153, 51);">/</span> YG<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">for</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> i <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> i <span class="sy0" style="color: rgb(51, 153, 51);"><</span> GC<span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>i<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>k<span class="br0" style="color: rgb(0, 153, 0);">)</span>colorWheel<span class="br0" style="color: rgb(0, 153, 0);">[</span>k<span class="br0" style="color: rgb(0, 153, 0);">]</span> <span class="sy0" style="color: rgb(51, 153, 51);">=</span> Vec3i<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span> <span class="sy0" style="color: rgb(51, 153, 51);">*</span> i <span class="sy0" style="color: rgb(51, 153, 51);">/</span> GC<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">for</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> i <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> i <span class="sy0" style="color: rgb(51, 153, 51);"><</span> CB<span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>i<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>k<span class="br0" style="color: rgb(0, 153, 0);">)</span>colorWheel<span class="br0" style="color: rgb(0, 153, 0);">[</span>k<span class="br0" style="color: rgb(0, 153, 0);">]</span> <span class="sy0" style="color: rgb(51, 153, 51);">=</span> Vec3i<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span> <span class="sy0" style="color: rgb(51, 153, 51);">*</span> i <span class="sy0" style="color: rgb(51, 153, 51);">/</span> CB<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">for</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> i <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> i <span class="sy0" style="color: rgb(51, 153, 51);"><</span> BM<span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>i<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>k<span class="br0" style="color: rgb(0, 153, 0);">)</span>colorWheel<span class="br0" style="color: rgb(0, 153, 0);">[</span>k<span class="br0" style="color: rgb(0, 153, 0);">]</span> <span class="sy0" style="color: rgb(51, 153, 51);">=</span> Vec3i<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">255</span> <span class="sy0" style="color: rgb(51, 153, 51);">*</span> i <span class="sy0" style="color: rgb(51, 153, 51);">/</span> BM<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">for</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> i <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> i <span class="sy0" style="color: rgb(51, 153, 51);"><</span> MR<span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>i<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>k<span class="br0" style="color: rgb(0, 153, 0);">)</span>colorWheel<span class="br0" style="color: rgb(0, 153, 0);">[</span>k<span class="br0" style="color: rgb(0, 153, 0);">]</span> <span class="sy0" style="color: rgb(51, 153, 51);">=</span> Vec3i<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">255</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span> <span class="sy0" style="color: rgb(51, 153, 51);">*</span> i <span class="sy0" style="color: rgb(51, 153, 51);">/</span> MR<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>first <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="kw2" style="font-weight: bold;">false</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">float</span> rad <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="kw3" style="color: rgb(0, 0, 102);">sqrt</span><span class="br0" style="color: rgb(0, 153, 0);">(</span>fx <span class="sy0" style="color: rgb(51, 153, 51);">*</span> fx <span class="sy0" style="color: rgb(51, 153, 51);">+</span> fy <span class="sy0" style="color: rgb(51, 153, 51);">*</span> fy<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">float</span> a <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="kw3" style="color: rgb(0, 0, 102);">atan2</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="sy0" style="color: rgb(51, 153, 51);">-</span>fy<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span>fx<span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">/</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">float</span><span class="br0" style="color: rgb(0, 153, 0);">)</span>CV_PI<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">float</span> fk <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span>a <span class="sy0" style="color: rgb(51, 153, 51);">+</span> <span class="nu17" style="color: rgb(128, 0, 128);">1.0f</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">/</span> <span class="nu17" style="color: rgb(128, 0, 128);">2.0f</span> <span class="sy0" style="color: rgb(51, 153, 51);">*</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span>NCOLS <span class="sy0" style="color: rgb(51, 153, 51);">-</span> <span class="nu0" style="color: rgb(0, 0, 221);">1</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">int</span> k0 <span class="sy0" style="color: rgb(51, 153, 51);">=</span> static_cast<span class="sy0" style="color: rgb(51, 153, 51);"><</span>int<span class="sy0" style="color: rgb(51, 153, 51);">></span><span class="br0" style="color: rgb(0, 153, 0);">(</span>fk<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">int</span> k1 <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span>k0 <span class="sy0" style="color: rgb(51, 153, 51);">+</span> <span class="nu0" style="color: rgb(0, 0, 221);">1</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">%</span> NCOLS<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">float</span> f <span class="sy0" style="color: rgb(51, 153, 51);">=</span> fk <span class="sy0" style="color: rgb(51, 153, 51);">-</span> k0<span class="sy0" style="color: rgb(51, 153, 51);">;</span>Vec3b pix<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">for</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> b <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> b <span class="sy0" style="color: rgb(51, 153, 51);"><</span> <span class="nu0" style="color: rgb(0, 0, 221);">3</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> b<span class="sy0" style="color: rgb(51, 153, 51);">++</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">float</span> col0 <span class="sy0" style="color: rgb(51, 153, 51);">=</span> colorWheel<span class="br0" style="color: rgb(0, 153, 0);">[</span>k0<span class="br0" style="color: rgb(0, 153, 0);">]</span><span class="br0" style="color: rgb(0, 153, 0);">[</span>b<span class="br0" style="color: rgb(0, 153, 0);">]</span> <span class="sy0" style="color: rgb(51, 153, 51);">/</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span>.<span class="me1" style="color: rgb(32, 32, 32);">f</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">float</span> col1 <span class="sy0" style="color: rgb(51, 153, 51);">=</span> colorWheel<span class="br0" style="color: rgb(0, 153, 0);">[</span>k1<span class="br0" style="color: rgb(0, 153, 0);">]</span><span class="br0" style="color: rgb(0, 153, 0);">[</span>b<span class="br0" style="color: rgb(0, 153, 0);">]</span> <span class="sy0" style="color: rgb(51, 153, 51);">/</span> <span class="nu0" style="color: rgb(0, 0, 221);">255</span>.<span class="me1" style="color: rgb(32, 32, 32);">f</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">float</span> col <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">1</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span> f<span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">*</span> col0 <span class="sy0" style="color: rgb(51, 153, 51);">+</span> f <span class="sy0" style="color: rgb(51, 153, 51);">*</span> col1<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">if</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span>rad <span class="sy0" style="color: rgb(51, 153, 51);"><=</span> <span class="nu0" style="color: rgb(0, 0, 221);">1</span><span class="br0" style="color: rgb(0, 153, 0);">)</span>col <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">1</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span> rad <span class="sy0" style="color: rgb(51, 153, 51);">*</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">1</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span> col<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="co1" style="color: rgb(102, 102, 102); font-style: italic;">// increase saturation with radius</span><span class="kw1" style="color: rgb(177, 177, 0);">else</span>col <span class="sy0" style="color: rgb(51, 153, 51);">*=</span> <span class="nu18" style="color: rgb(128, 0, 128);">.75</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="co1" style="color: rgb(102, 102, 102); font-style: italic;">// out of range</span>pix<span class="br0" style="color: rgb(0, 153, 0);">[</span><span class="nu0" style="color: rgb(0, 0, 221);">2</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span> b<span class="br0" style="color: rgb(0, 153, 0);">]</span> <span class="sy0" style="color: rgb(51, 153, 51);">=</span> static_cast<span class="sy0" style="color: rgb(51, 153, 51);"><</span>uchar<span class="sy0" style="color: rgb(51, 153, 51);">></span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">255</span>.<span class="me1" style="color: rgb(32, 32, 32);">f</span> <span class="sy0" style="color: rgb(51, 153, 51);">*</span> col<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span><span class="kw1" style="color: rgb(177, 177, 0);">return</span> pix<span class="sy0" style="color: rgb(51, 153, 51);">;</span>
<span class="br0" style="color: rgb(0, 153, 0);">}</span><span class="kw4" style="color: rgb(153, 51, 51);">static</span> <span class="kw4" style="color: rgb(153, 51, 51);">void</span> drawOpticalFlow<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> Mat_<span class="sy0" style="color: rgb(51, 153, 51);"><</span>Point2f<span class="sy0" style="color: rgb(51, 153, 51);">>&</span> flow<span class="sy0" style="color: rgb(51, 153, 51);">,</span> Mat<span class="sy0" style="color: rgb(51, 153, 51);">&</span> dst<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="kw4" style="color: rgb(153, 51, 51);">float</span> maxmotion <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span><span class="nu0" style="color: rgb(0, 0, 221);">1</span><span class="br0" style="color: rgb(0, 153, 0);">)</span>
<span class="br0" style="color: rgb(0, 153, 0);">{</span>dst.<span class="me1" style="color: rgb(32, 32, 32);">create</span><span class="br0" style="color: rgb(0, 153, 0);">(</span>flow.<span class="me1" style="color: rgb(32, 32, 32);">size</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> CV_8UC3<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>dst.<span class="me1" style="color: rgb(32, 32, 32);">setTo</span><span class="br0" style="color: rgb(0, 153, 0);">(</span>Scalar<span class="sy0" style="color: rgb(51, 153, 51);">::</span><span class="me2" style="color: rgb(32, 32, 32);">all</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="co1" style="color: rgb(102, 102, 102); font-style: italic;">// determine motion range:</span><span class="kw4" style="color: rgb(153, 51, 51);">float</span> maxrad <span class="sy0" style="color: rgb(51, 153, 51);">=</span> maxmotion<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">if</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span>maxmotion <span class="sy0" style="color: rgb(51, 153, 51);"><=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span>maxrad <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">1</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">for</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> y <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> y <span class="sy0" style="color: rgb(51, 153, 51);"><</span> flow.<span class="me1" style="color: rgb(32, 32, 32);">rows</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>y<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span><span class="kw1" style="color: rgb(177, 177, 0);">for</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> x <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> x <span class="sy0" style="color: rgb(51, 153, 51);"><</span> flow.<span class="me1" style="color: rgb(32, 32, 32);">cols</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>x<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span>Point2f u <span class="sy0" style="color: rgb(51, 153, 51);">=</span> flow<span class="br0" style="color: rgb(0, 153, 0);">(</span>y<span class="sy0" style="color: rgb(51, 153, 51);">,</span> x<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">if</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="sy0" style="color: rgb(51, 153, 51);">!</span>isFlowCorrect<span class="br0" style="color: rgb(0, 153, 0);">(</span>u<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="kw1" style="color: rgb(177, 177, 0);">continue</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>maxrad <span class="sy0" style="color: rgb(51, 153, 51);">=</span> max<span class="br0" style="color: rgb(0, 153, 0);">(</span>maxrad<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="kw3" style="color: rgb(0, 0, 102);">sqrt</span><span class="br0" style="color: rgb(0, 153, 0);">(</span>u.<span class="me1" style="color: rgb(32, 32, 32);">x</span> <span class="sy0" style="color: rgb(51, 153, 51);">*</span> u.<span class="me1" style="color: rgb(32, 32, 32);">x</span> <span class="sy0" style="color: rgb(51, 153, 51);">+</span> u.<span class="me1" style="color: rgb(32, 32, 32);">y</span> <span class="sy0" style="color: rgb(51, 153, 51);">*</span> u.<span class="me1" style="color: rgb(32, 32, 32);">y</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span><span class="br0" style="color: rgb(0, 153, 0);">}</span><span class="br0" style="color: rgb(0, 153, 0);">}</span><span class="kw1" style="color: rgb(177, 177, 0);">for</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> y <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> y <span class="sy0" style="color: rgb(51, 153, 51);"><</span> flow.<span class="me1" style="color: rgb(32, 32, 32);">rows</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>y<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span><span class="kw1" style="color: rgb(177, 177, 0);">for</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> x <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> x <span class="sy0" style="color: rgb(51, 153, 51);"><</span> flow.<span class="me1" style="color: rgb(32, 32, 32);">cols</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span> <span class="sy0" style="color: rgb(51, 153, 51);">++</span>x<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span>Point2f u <span class="sy0" style="color: rgb(51, 153, 51);">=</span> flow<span class="br0" style="color: rgb(0, 153, 0);">(</span>y<span class="sy0" style="color: rgb(51, 153, 51);">,</span> x<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">if</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span>isFlowCorrect<span class="br0" style="color: rgb(0, 153, 0);">(</span>u<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">)</span>dst.<span class="me1" style="color: rgb(32, 32, 32);">at</span><span class="sy0" style="color: rgb(51, 153, 51);"><</span>Vec3b<span class="sy0" style="color: rgb(51, 153, 51);">></span><span class="br0" style="color: rgb(0, 153, 0);">(</span>y<span class="sy0" style="color: rgb(51, 153, 51);">,</span> x<span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">=</span> computeColor<span class="br0" style="color: rgb(0, 153, 0);">(</span>u.<span class="me1" style="color: rgb(32, 32, 32);">x</span> <span class="sy0" style="color: rgb(51, 153, 51);">/</span> maxrad<span class="sy0" style="color: rgb(51, 153, 51);">,</span> u.<span class="me1" style="color: rgb(32, 32, 32);">y</span> <span class="sy0" style="color: rgb(51, 153, 51);">/</span> maxrad<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span><span class="br0" style="color: rgb(0, 153, 0);">}</span>
<span class="br0" style="color: rgb(0, 153, 0);">}</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> main<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> argc<span class="sy0" style="color: rgb(51, 153, 51);">,</span> <span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">char</span><span class="sy0" style="color: rgb(51, 153, 51);">*</span> argv<span class="br0" style="color: rgb(0, 153, 0);">[</span><span class="br0" style="color: rgb(0, 153, 0);">]</span><span class="br0" style="color: rgb(0, 153, 0);">)</span>
<span class="br0" style="color: rgb(0, 153, 0);">{</span>Mat frame0<span class="sy0" style="color: rgb(51, 153, 51);">;</span>Mat frame1<span class="sy0" style="color: rgb(51, 153, 51);">;</span>Mat_<span class="sy0" style="color: rgb(51, 153, 51);"><</span>Point2f<span class="sy0" style="color: rgb(51, 153, 51);">></span> flow<span class="sy0" style="color: rgb(51, 153, 51);">;</span>Ptr<span class="sy0" style="color: rgb(51, 153, 51);"><</span>DenseOpticalFlow<span class="sy0" style="color: rgb(51, 153, 51);">></span> tvl1 <span class="sy0" style="color: rgb(51, 153, 51);">=</span> createOptFlow_DualTVL1<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>Mat out<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">if</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span>argc <span class="sy0" style="color: rgb(51, 153, 51);"><</span> <span class="nu0" style="color: rgb(0, 0, 221);">2</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span>cerr <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> <span class="st0" style="color: rgb(255, 0, 0);">"Usage : "</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> argv<span class="br0" style="color: rgb(0, 153, 0);">[</span><span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="br0" style="color: rgb(0, 153, 0);">]</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> <span class="st0" style="color: rgb(255, 0, 0);">"<video>"</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> endl<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">return</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span><span class="nu0" style="color: rgb(0, 0, 221);">1</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span>VideoCapture cap<span class="sy0" style="color: rgb(51, 153, 51);">;</span>cap.<span class="me1" style="color: rgb(32, 32, 32);">open</span><span class="br0" style="color: rgb(0, 153, 0);">(</span>argv<span class="br0" style="color: rgb(0, 153, 0);">[</span><span class="nu0" style="color: rgb(0, 0, 221);">1</span><span class="br0" style="color: rgb(0, 153, 0);">]</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">while</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">1</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span>cap <span class="sy0" style="color: rgb(51, 153, 51);">>></span> frame0<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">if</span><span class="br0" style="color: rgb(0, 153, 0);">(</span>frame0.<span class="me1" style="color: rgb(32, 32, 32);">empty</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span>cerr<span class="sy0" style="color: rgb(51, 153, 51);"><<</span> <span class="st0" style="color: rgb(255, 0, 0);">"video is over!!"</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> endl<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw2" style="font-weight: bold;">break</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span>cvtColor<span class="br0" style="color: rgb(0, 153, 0);">(</span>frame0<span class="sy0" style="color: rgb(51, 153, 51);">,</span> frame0<span class="sy0" style="color: rgb(51, 153, 51);">,</span> CV_BGR2GRAY<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">if</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="sy0" style="color: rgb(51, 153, 51);">!</span>frame1.<span class="me1" style="color: rgb(32, 32, 32);">empty</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">double</span> start <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">double</span><span class="br0" style="color: rgb(0, 153, 0);">)</span>getTickCount<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>tvl1<span class="sy0" style="color: rgb(51, 153, 51);">-></span>calc<span class="br0" style="color: rgb(0, 153, 0);">(</span>frame0<span class="sy0" style="color: rgb(51, 153, 51);">,</span> frame1<span class="sy0" style="color: rgb(51, 153, 51);">,</span> flow<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">double</span> timeSec <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span>getTickCount<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span> start<span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">/</span> getTickFrequency<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>cout <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> <span class="st0" style="color: rgb(255, 0, 0);">"calcOpticalFlowDual_TVL1 : "</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> timeSec <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> <span class="st0" style="color: rgb(255, 0, 0);">" sec"</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> endl<span class="sy0" style="color: rgb(51, 153, 51);">;</span>drawOpticalFlow<span class="br0" style="color: rgb(0, 153, 0);">(</span>flow<span class="sy0" style="color: rgb(51, 153, 51);">,</span> out<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>imshow<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="st0" style="color: rgb(255, 0, 0);">"out"</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> out<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>imshow<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="st0" style="color: rgb(255, 0, 0);">"src"</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> frame0<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>waitKey<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">10</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span>frame0.<span class="me1" style="color: rgb(32, 32, 32);">copyTo</span><span class="br0" style="color: rgb(0, 153, 0);">(</span>frame1<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span>waitKey<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">return</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>
<span class="br0" style="color: rgb(0, 153, 0);">}</span>

代码讲解

  1、创建了一个DenseOpticalFlow实例,同时获得打开了需要跟踪处理的video视频到cap中。
        Ptr<span class="sy0" style="color: rgb(51, 153, 51);"><</span>DenseOpticalFlow<span class="sy0" style="color: rgb(51, 153, 51);">></span> tvl1 <span class="sy0" style="color: rgb(51, 153, 51);">=</span> createOptFlow_DualTVL1<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>Mat out<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">if</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span>argc <span class="sy0" style="color: rgb(51, 153, 51);"><</span> <span class="nu0" style="color: rgb(0, 0, 221);">2</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span>cerr <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> <span class="st0" style="color: rgb(255, 0, 0);">"Usage : "</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> argv<span class="br0" style="color: rgb(0, 153, 0);">[</span><span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="br0" style="color: rgb(0, 153, 0);">]</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> <span class="st0" style="color: rgb(255, 0, 0);">"<video>"</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> endl<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">return</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span><span class="nu0" style="color: rgb(0, 0, 221);">1</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span>VideoCapture cap<span class="sy0" style="color: rgb(51, 153, 51);">;</span>cap.<span class="me1" style="color: rgb(32, 32, 32);">open</span><span class="br0" style="color: rgb(0, 153, 0);">(</span>argv<span class="br0" style="color: rgb(0, 153, 0);">[</span><span class="nu0" style="color: rgb(0, 0, 221);">1</span><span class="br0" style="color: rgb(0, 153, 0);">]</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>

  2、在循环中,不断的读取video的帧数据到frame0中,接着cvtColor将frame0中的数据,灰阶化。判断到存储前一帧数据为空,也就是表示
刚刚读取到第一帧数据时候,不进入处理函数中,直接跳过。最后将frame0中的帧数据,保存到frame1中。frame0进入下一次循环,获得新一帧
数据。
     <span class="kw1" style="color: rgb(177, 177, 0);">while</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">1</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span>cap <span class="sy0" style="color: rgb(51, 153, 51);">>></span> frame0<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">if</span><span class="br0" style="color: rgb(0, 153, 0);">(</span>frame0.<span class="me1" style="color: rgb(32, 32, 32);">empty</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span>cerr<span class="sy0" style="color: rgb(51, 153, 51);"><<</span> <span class="st0" style="color: rgb(255, 0, 0);">"video is over!!"</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> endl<span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw2" style="font-weight: bold;">break</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span>cvtColor<span class="br0" style="color: rgb(0, 153, 0);">(</span>frame0<span class="sy0" style="color: rgb(51, 153, 51);">,</span> frame0<span class="sy0" style="color: rgb(51, 153, 51);">,</span> CV_BGR2GRAY<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw1" style="color: rgb(177, 177, 0);">if</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="sy0" style="color: rgb(51, 153, 51);">!</span>frame1.<span class="me1" style="color: rgb(32, 32, 32);">empty</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">{</span>......................<span class="br0" style="color: rgb(0, 153, 0);">}</span>frame0.<span class="me1" style="color: rgb(32, 32, 32);">copyTo</span><span class="br0" style="color: rgb(0, 153, 0);">(</span>frame1<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span>

  3、当检测到frame1保存了前一帧数据之后,进入到流光法计算中。首先获得当前时钟getTickCount。使用tvl1->calc分别传入当前
帧(frame0)和前一帧(frame1),将获得的位置偏移保存到flow中。接着计算出calc函数处理花费的时间,之后使用函数
drawOpticalFlow,利用flow中的位置偏移,根据偏移位置的方向和速度,从而在out图像,对应位置赋予不同的颜色和饱和度。最后将
当前帧图像和处理之后的out图像分别显示出来。
        <span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">double</span> start <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">double</span><span class="br0" style="color: rgb(0, 153, 0);">)</span>getTickCount<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>tvl1<span class="sy0" style="color: rgb(51, 153, 51);">-></span>calc<span class="br0" style="color: rgb(0, 153, 0);">(</span>frame0<span class="sy0" style="color: rgb(51, 153, 51);">,</span> frame1<span class="sy0" style="color: rgb(51, 153, 51);">,</span> flow<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="kw4" style="color: rgb(153, 51, 51);">const</span> <span class="kw4" style="color: rgb(153, 51, 51);">double</span> timeSec <span class="sy0" style="color: rgb(51, 153, 51);">=</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span>getTickCount<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">-</span> start<span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">/</span> getTickFrequency<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>cout <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> <span class="st0" style="color: rgb(255, 0, 0);">"calcOpticalFlowDual_TVL1 : "</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> timeSec <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> <span class="st0" style="color: rgb(255, 0, 0);">" sec"</span> <span class="sy0" style="color: rgb(51, 153, 51);"><<</span> endl<span class="sy0" style="color: rgb(51, 153, 51);">;</span>drawOpticalFlow<span class="br0" style="color: rgb(0, 153, 0);">(</span>flow<span class="sy0" style="color: rgb(51, 153, 51);">,</span> out<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>imshow<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="st0" style="color: rgb(255, 0, 0);">"out"</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> out<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>imshow<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="st0" style="color: rgb(255, 0, 0);">"src"</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> frame0<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>waitKey<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="nu0" style="color: rgb(0, 0, 221);">10</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>

效果演示

 对应的效果演示如下:

使用流光法实现物体跟踪相关推荐

  1. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  2. 粒子滤波实现物体跟踪

    转自http://www.cnblogs.com/cfantaisie/archive/2011/06/16/2082267.html 粒子滤波实现物体跟踪的算法原理: 1)初始化阶段-提取跟踪目标特 ...

  3. 基于粒子滤波的物体跟踪

    一直都觉得粒子滤波是个挺牛的东西,每次试图看文献都被复杂的数学符号搞得看不下去.一个偶然的机会发现了Rob Hess(http://web.engr.oregonstate.edu/~hess/)实现 ...

  4. 基于粒子滤波的物体跟踪(转)

    作者的这篇文章写的浅显易懂,很容易理解其基本思想. 转自:http://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html 视频显示 ...

  5. 树莓派视觉小车 -- 物体跟踪(OpenCV)

    目录 物体跟踪效果展示 过程: 一.初始化 二.运动控制函数 三.舵机角度控制 四.摄像头&&图像处理 1.打开摄像头 2.把图像转换为灰度图 3. 高斯滤波(去噪) 4.亮度增强 5 ...

  6. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  7. opencv---颜色空间转化并实现物体跟踪

    一.图像处理的基本操作 因为这是第一篇写opencv的笔记,故先讲讲在python下写opencv的基本操作.总共总结了三点如下: 开头一定要加编码声明:-*- coding: utf-8 -*- p ...

  8. OpenCV4每日一练day3:运行OpenCV示例程序(物体跟踪)

    step1:准备好摄像头,或用电脑自带摄像头也可以.这里使用的是英特尔D435i. step2:找到OpenCV自带的物体跟踪demo--camshiftdemo.cpp,添加到VS2015源文件中 ...

  9. 室内声场计算机模拟的声线跟踪法和虚声源法,基于声线跟踪法的室外声场仿真.doc...

    基于声线跟踪法的室外声场仿真 谭同德,史晓菲,赵新灿,常村红TAN Tong-de,SHI Xiao-fei,ZHAO Xin-can,CHANG Cun-hong郑州大学 信息工程学院,郑州 450 ...

最新文章

  1. 红帽虚拟化RHEV3.2创建虚拟机(图文Step by Step)
  2. oracle 取系统当前年份_Oracle如何获取系统当前时间等操作实例
  3. GCC __builtin_expect与kernel指令序列优化
  4. Java 虚拟机学习笔记 | 运行时数据区总结
  5. 大数据可视化分析以及预测性分析方法
  6. gps android时钟同步,时间同步下载-时间同步(Clocksync) 安卓版v1.2.6-PC6安卓网
  7. click和touchmove vue_移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法...
  8. CPU使用率过高如何排查问题
  9. pwm一个时间单位_「硬见小百科」什么是PWM“死区”?
  10. 中国计算机学会2022年度CCF会士名单公布 阿里云李飞飞等9位当选
  11. kaggle笔记 2019数据科学碗Data Science Bowl 高分总结
  12. 气源站护士站区域气体监控解决方案
  13. 成都有什么好的互联网公司推荐?
  14. 0丢失之谜:解决Oracle中0开头小数被截断的问题
  15. duoyinzi_pinyin
  16. WBSC 世界棒垒球总会·亚洲
  17. lucene原理及java实现
  18. 一笔画(AC)DFS算法
  19. 「国内招聘」软件工程师
  20. 23种设计模式-行为型-模板模式

热门文章

  1. CentOS 6.3开机自动挂载磁盘和文件夹
  2. mac 终端快捷命令
  3. TCP与UDP之间的区别
  4. linux 内核网络协议栈--IP层开始直到包被处理(三)
  5. KVM中I/O虚拟化介绍(五)
  6. 电脑桌面路径多了个计算机名,文件太多,电脑桌面太乱?一个技巧帮你解决!...
  7. 在Visual Studio 2005里,用ActiveSync来同步模拟器(Windows Mobile 5.0 )
  8. 前端使用 Nginx 反向代理彻底解决跨域问题
  9. 03-老马jQuery教程-DOM操作(上)
  10. 请求筛选模块被配置为拒绝包含 hiddenSegment 节的 URL 中的路径