使用流光法实现物体跟踪
生活随笔
收集整理的這篇文章主要介紹了
使用流光法实现物体跟踪
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡介
本篇講解使用opencv提供的流光法算法接口,實(shí)現(xiàn)物體跟蹤。范例代碼為參考修改tvl1_optical_flow.cpp實(shí)現(xiàn)。具體實(shí)現(xiàn)
實(shí)現(xiàn)代碼
<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、創(chuàng)建了一個(gè)DenseOpticalFlow實(shí)例,同時(shí)獲得打開了需要跟蹤處理的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、在循環(huán)中,不斷的讀取video的幀數(shù)據(jù)到frame0中,接著cvtColor將frame0中的數(shù)據(jù),灰階化。判斷到存儲(chǔ)前一幀數(shù)據(jù)為空,也就是表示 剛剛讀取到第一幀數(shù)據(jù)時(shí)候,不進(jìn)入處理函數(shù)中,直接跳過。最后將frame0中的幀數(shù)據(jù),保存到frame1中。frame0進(jìn)入下一次循環(huán),獲得新一幀 數(shù)據(jù)。 <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、當(dāng)檢測(cè)到frame1保存了前一幀數(shù)據(jù)之后,進(jìn)入到流光法計(jì)算中。首先獲得當(dāng)前時(shí)鐘getTickCount。使用tvl1->calc分別傳入當(dāng)前 幀(frame0)和前一幀(frame1),將獲得的位置偏移保存到flow中。接著計(jì)算出calc函數(shù)處理花費(fèi)的時(shí)間,之后使用函數(shù) drawOpticalFlow,利用flow中的位置偏移,根據(jù)偏移位置的方向和速度,從而在out圖像,對(duì)應(yīng)位置賦予不同的顏色和飽和度。最后將 當(dāng)前幀圖像和處理之后的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>效果演示
對(duì)應(yīng)的效果演示如下:總結(jié)
以上是生活随笔為你收集整理的使用流光法实现物体跟踪的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv实现图片HDR功能
- 下一篇: 图像低频高频区域分离