![](https://habrastorage.org/getpro/habr/post_images/6e7/202/488/6e7202488554327be02a3b211df4647a.jpg)
ãªããã£ã«ã«ãããŒïŒãªããã£ã«ã«ãããŒïŒ-ã·ãããã»ã°ã¡ã³ããŒã·ã§ã³ããªããžã§ã¯ãã®éžæããããªå§çž®ã決å®ããããã«ã³ã³ãã¥ãŒã¿ãŒããžã§ã³ã®ããŸããŸãªåéã§äœ¿çšãããæè¡ã ãããããŠã£ãããã£ã¢ãŸãã¯ä»ã®å Žæã§èªãã§ãããžã§ã¯ãã«ãã°ããå®è£ ãããå Žåã¯ãéåžžã«ããŸãæ©èœããããã§ã«1ã2ã®ãªãŒããŒã®ã·ããã決å®ãããšãã«å€±æãããšããäºå®ã«ã€ãŸããã§ããããã¯ã»ã«ïŒå°ãªããšãç§ãšäžç·ã«ïŒã 次ã«ãããšãã°OpenCVã§ã®æ¢è£œã®å®è£ ã䜿çšããŸãã ããã§ã¯ããŸããŸãªæ¹æ³ã§å®è£ ãããŠãããç¥èªPyrLKãFarnebackãŸãã¯ãã®ãããªãã®ãããåªããŠãããæªãã®ãã¯å®å šã«ç解äžèœã§ãããããã€ãã®å®è£ ã§ã¯éåžžã«å€ãã®ãã©ã¡ãŒã¿ãŒã®æå³ãåŠçããå¿ èŠããããŸãã ãããŠãèå³æ·±ãããšã«ããããã®ã¢ã«ãŽãªãºã ã¯ãç§ãã¡èªèº«ãæžãããã®ãšã¯å¯Ÿç §çã«ãäœããã®åœ¢ã§æ©èœããŸãã ãã®ç§å¯ã¯äœã§ããïŒ
ãªããã£ã«ã«ãããŒãšã¯äœã§ããïŒ
ãªããã£ã«ã«ãããŒïŒOPïŒã¯ãç®ã«èŠããåãã®ç»åã§ããã2ã€ã®ç»åéã®åãã€ã³ãã®ã·ããã§ãã å®éãããã¯é床ãã£ãŒã«ãã§ãïŒã¹ã±ãŒã«ã«å¯ŸããŠæ£ç¢ºãªã·ããã¯ç¬éé床ã«çããããïŒã OPã®æ¬è³ªã¯ãç»åã®åãã€ã³ãã«å¯ŸããŠ
![I_ {1}ïŒxãyïŒ](https://habrastorage.org/getpro/habr/post_images/f71/612/3c2/f716123c2f39bc49d6918609b906d32d.gif)
![I_ {2}ïŒx + dxãy + dyïŒ](https://habrastorage.org/getpro/habr/post_images/2b4/c10/d02/2b4c10d02e21c2ac9f51f206f53d85ac.gif)
ãã®ãããªèšè¿°ã«ããã°ãOPã¯ç¹åŸŽç¹ã®æ€çŽ¢ããã³æ¯èŒãšæ··åãããå¯èœæ§ããããŸãã ãããããããã¯ç°ãªããã®ã§ãããå åŠã¹ããªãŒã ã®æ¬è³ªã¯ãç¹å¥ãªãã€ã³ããæ¢ãã®ã§ã¯ãªããä»»æã®ãã€ã³ããã·ããããç»åã®ãã©ã¡ãŒã¿ãŒã«ãã£ãŠæ±ºå®ããããšããããšã§ãã
å æã®èšç®ã«ã¯ãé«å¯åºŠãšéžæçïŒçïŒã®2ã€ã®ãªãã·ã§ã³ããããŸãã ã¹ããŒã¹ã¹ããªãŒã ã¯ãåã ã®ç¹å®ã®ãã€ã³ãïŒããšãã°ãããã€ãã®ç¹åŸŽæ€åºåšã«ãã£ãŠéžæããããã€ã³ãïŒã®ã·ãããèšç®ããé«å¯åºŠã¹ããªãŒã ã¯ç»åå ã®ãã¹ãŠã®ãã€ã³ãã®ã·ãããèæ ®ããŸãã åœç¶ããµã³ãã«ã¹ããªãŒã ã¯ããé«éã«èšç®ãããŸãããäžéšã®ã¢ã«ãŽãªãºã ã§ã¯å·®ã¯ããã»ã©å€§ãããªããäžéšã®ã¿ã¹ã¯ã§ã¯ç»åã®ãã¹ãŠã®ãã€ã³ãã§ã¹ããªãŒã ãèŠã€ããå¿ èŠããããŸãã
çž®éããå Žåã«ã¯ãã·ããã決å®ããããã®ããåçŽãªæ¹æ³ãé©çšã§ããŸãã ç¹ã«ãç»åã®ãã¹ãŠã®ãã€ã³ãã«åãã·ãããããå ŽåïŒç»åå šäœãã·ããããå ŽåïŒãäœçžçžé¢æ³ãé©çšã§ããŸãïŒäž¡æ¹ã®ç»åã®ããŒãªãšå€æãèšç®ããäœçžã®ç³ã¿èŸŒã¿ãèŠã€ãããã®ã·ããã決å®ããŸãïŒ en.wikipedia.orgãåç §ïŒ / wiki / Phase_correlation ïŒã ãããã¯ãããã³ã°ã䜿çšããããšãã§ããŸãããŠã£ã³ããŠå ã®ç»åã®å·®ã®æšæºãæå°åããã·ãããèŠã€ããŸãã çŽç²ãªåœ¢ã§ã¯ããã®ãããªã¢ã«ãŽãªãºã ã¯é·æéæ©èœããæ²ãããã®ä»ã®æªã¿ã«å¯ŸããŠäžå®å®ã§ãã è±èªçãŠã£ãããã£ã¢ã«ã¯ããããã®ã¢ã«ãŽãªãºã ããªããã£ã«ã«ãããŒãèšç®ããããã®ç°ãªããªãã·ã§ã³ãšããŠãªã¹ããããŠããŸããããããã®ã¢ã«ãŽãªãºã ã¯ä»ã®ç®çã«äœ¿çšã§ãããã®åé¡ãå®å šã«ã¯è§£æ±ºããªããããããŸãæ£ç¢ºã§ã¯ãªãããã§ãã ç»åã®å±æçãªç¹æ§ã«åºã¥ããŠãªããã£ã«ã«ãããŒã¡ãœããïŒè±èªçãŠã£ãããã£ã¢ã§ã¯å·®åæ³ãšåŒã°ããŸãïŒãåŒã³åºããŸãã
æšæºã¢ãããŒãïŒã«ãŒã«ã¹-ã«ããæ³ïŒ
ã¢ã«ãŽãªãºã ã®æ°åŠçãªèª¬æã¯ãã®èšäºã§åå詳现ã«èª¬æãããŠããŸãã ãçè«çãªåŽé¢ã®ã¿ã圱é¿ãåããŸãã
å€äœã®çµæãšããŠã®ãã€ã³ãã®åŒ·åºŠãå€åããŠããªããšä»®å®ããŠããªããã£ã«ã«ãããŒã®æ°åŠã¢ãã«ãæ€èšããŸãã
ãããŠ
![](https://habrastorage.org/getpro/habr/post_images/fd3/055/cea/fd3055ceaa3ac999993187efe591cc42.gif)
![](https://habrastorage.org/getpro/habr/post_images/d80/ad7/750/d80ad77501aec2e45d1b199cabe7db55.gif)
![I_ {x}ãI_ {y}ãI_ {t}](https://habrastorage.org/getpro/habr/post_images/f99/825/2f4/f998252f474a4343e85c303adf28373e.gif)
![I_ {t} dt](https://habrastorage.org/getpro/habr/post_images/fa2/480/f49/fa2480f4986572e0094d9e2872b7812d.gif)
ãã€ã³ãã¯åŒ·åºŠãä¿æããŠãããšèããŠããŸããã€ãŸãã
![I_ {1} = I_ {2} \å³ç¢å°](https://habrastorage.org/getpro/habr/post_images/fd6/d01/d16/fd6d01d1619a38b1dadb04280c84f7f5.gif)
![](https://habrastorage.org/getpro/habr/post_images/240/a53/130/240a531308dcc6d61a797f29f0d09b7d.gif)
2ã€ã®æªç¥æ°ïŒdxãšdyïŒãæã€1ã€ã®æ¹çšåŒãåŸãããŸããã€ãŸãã解ãã®ã«ååã§ã¯ãããŸãããã€ãŸãããã®æ¹çšåŒãç解ããããšã¯ã§ããŸããã
ãã®åé¡ã®æãç°¡åãªè§£æ±ºçã¯ãã«ãŒã«ã¹ã«ããã¢ã«ãŽãªãºã ã§ãã ç»åãªããžã§ã¯ãã«ã¯1ãã¯ã»ã«ãã倧ããã®ã§ãçŸåšã®ãã€ã³ãã®è¿ãã§ã¯ãä»ã®ãã€ã³ããã»ãŒåãã·ãããæã£ãŠããå¯èœæ§ãé«ãããšãæå³ããŸãã ãããã£ãŠããã®ç¹ã®åšãã«ãŠã£ã³ããŠãåããã¬ãŠã¹ã«åŸã£ãŠååžããéã¿ä¿æ°ã䜿çšããŠãã€ãŸãã調æ»äžã®ãã¯ã»ã«ã«æãè¿ããã¯ã»ã«ã®éã¿ãæ倧ã«ãªãããã«ãïŒæå°äºä¹æ³ã«åŸã£ãŠïŒåèšèª€å·®ãæå°åããŸãã æãåçŽãªå€æã®åŸã2ã€ã®æªç¥æ°ãæã€2ã€ã®æ¹çšåŒã®ã·ã¹ãã ãååŸããŸãã
![](https://habrastorage.org/getpro/habr/post_images/0ce/761/7f0/0ce7617f00672f62bc3b8819af66f72d.gif)
![](https://habrastorage.org/getpro/habr/post_images/f56/644/5aa/f566445aa7c1524c856f73396a28dea5.gif)
ãåãã®ããã«ããã®ã·ã¹ãã ã«ã¯åžžã«äžæã®è§£ãããããã§ã¯ãããŸããïŒéåžžã«é »ç¹ã§ããïŒãã·ã¹ãã ã®è¡ååŒããŒãã®å Žåã解ããªããç¡éæ°ã«ãªããŸãã ãã®åé¡ã¯ãéå£ã®åé¡ãšããŠç¥ãããŠããŸã-åšæçãªç»åã®èŠéãéãããŠããå€äœã®ãããŸããã ããã¯ãããçšåºŠã®åšææ§ãããç»åã®æçãèŠéã«å ¥ãå Žåã«å¯Ÿå¿ããŸãã ããã§ããåçãã©ãã«ç§»åãããã人ãæ確ã«å€æããããšã¯ã§ããŸããã åé¡ã¯ããã®ãããªãããŸããªç¶æ³ã§ã®ãã€ãºã®ããã«ããŒãã®è¡ååŒã§ã¯ãªããéåžžã«å°ããªå€ãåŸãããã·ããã®å€ãéåžžã«å€§ãããªãå¯èœæ§ããããå®éã«ã¯ç¹ã«çžé¢ããªãããšã§ãã ãã®ãããç¹å®ã®æ®µéã§ãã·ã¹ãã ã®è¡ååŒãååã«å°ãããªããã©ããã確èªããå¿ èŠããããŸããããããã§ããã°ããã®ãããªç¹ãèæ ®ãããããšã©ãŒãšããŠããŒã¯ããªãã§ãã ããã
ãªãæ©èœããªãã®ã§ããïŒ
ãã®æ®µéã§åæ¢ããŠãã®ã¢ã«ãŽãªãºã ãå®è£ ãããšãæ£åžžã«æ©èœããŸãã ããããé£æ¥ããç»åéã®ã·ãããéåžžã«å°ããã1ãã¯ã»ã«ã®ãªãŒããŒã§ããå Žåã«ã®ã¿ãåžžã«ã§ã¯ãããŸããã ïŒå質åæã®ããã«ç°ãªãçžå¯Ÿãªãã»ãããæã€åæã·ãŒã±ã³ã¹ãçæããããã®ã·ããã¯éæŽæ°ã®ãã¯ã»ã«æ°ã§è¡šãããšãã§ããçµæã®ã€ã¡ãŒãžã¯ããã«å¿ããŠè£éãããŸãïŒ2ãã¯ã»ã«ã®ã·ããã§ã¯ãã§ã«ãšã©ãŒã倧ãããªãã3以äžã®å Žåãçµæã¯äžè¬ã«äžååã«ãªããŸãã åé¡ã¯äœã§ããïŒ
ãã®åŸãæ°åŠãçšæãããŸããã 圌女ã¯ãåšå²ã®ãã¹ãŠã®æ©èœãäœåºŠãé£ç¶çã§åŸ®åå¯èœã§ãããšããæèŠãç§ãã¡ã«æ€ãä»ããŸããã äžè¬ã«ãç 究æã§ã¯ããã€ã©ãŒã®åŒã䜿çšããŠãç¹ã®è¿åã«é¢æ°ã®è¿äŒŒãæžãããã«æããããŸããã ããã§ããã®å Žæã§æŽŸçç©ã®ç©ççãªæå³ã¯äœã§ããïŒ ãããã䜿çšããŠãç¹ã®æéè¿åã§é¢æ°ã®å€ã®å€åã決å®ããå°é¢æ°ã¯ç¡éã«å°ããè¿åã®ã¢ã€ãã¢ãäžããŸãã ãã®è¿åãæ¡å€§ããã«ã¯ãããŒã©ãŒå±éã«é«æ¬¡ã®å°é¢æ°ãè¿œå ã§ããŸãããããã¯ã·ã¹ãã ã®éç·åœ¢æ§ã«ã€ãªããã解決ãã¯ããã«å°é£ã«ãªããç¹ã«å®éã«ã¯é£ç¶çã§åŸ®åå¯èœãªåŸ®åãæ±ã£ãŠããªããããå©ç¹ã¯çãããã§ãé¢æ°ã§ãããäžè¬çã«ã©ã®é¢æ£é¢æ°ãã¯æ確ã§ã¯ãããŸããã ãããã£ãŠãé¢æ°gïŒxïŒãæ¢ãæ¹ãè«ççã§ãããã®å Žåãé¢æ£ã±ãŒã¹ã§ã¯ãfïŒxïŒ+ gïŒxïŒ= fïŒx + 1ïŒãfïŒxïŒ+ 2gïŒxïŒ= fïŒx +2ïŒãfïŒxïŒ-gïŒxïŒ= fïŒx-1ïŒãªã©ãããã£ãŠããã®å Žåãå°é¢æ°ã¯å¿ èŠãããŸããããå ã®é¢æ°ã®ç¹ã«æãè¿ãç·åœ¢é¢æ°ãå¿ èŠã§ãã ç°¡åãªæ°åŠçèšç®ã解決ã«ã€ãªãã
![](https://habrastorage.org/getpro/habr/post_images/873/fc4/f2e/873fc4f2ef7f7bc8cc586734f2e1eeb6.gif)
![](https://habrastorage.org/getpro/habr/post_images/5e3/400/fb2/5e3400fb2e1b01aad1ad4c61fc1f286a.gif)
æããã«ãããšãã°å ã®ãã€ã³ãã®å·Šå³ã®3ã€ã®é£æ¥ãããã€ã³ããããã®é¢æ°ãæ§ç¯ããå Žåãããã¯ããé ãã«ãããã€ã³ãã«ãŸã£ããäŸåããããããã£ãŠã3ã€ä»¥äžã®ãã€ã³ããã·ãããããšãäžé©åãªçµæãåŸãããããšããããããŸãã ãŸãããã®é¢æ°ãäœæãããã€ã³ãã®æ°ãå€ãã»ã©ã䜿çšããããã€ã³ãããã®çµæã®ç·ã®å¹³ååå·®ã倧ãããªããŸã-åã³ãç·åœ¢ã«å€åããç»åã¯ãªãããæªéã¯ã©ã®ç»åãç¥ã£ãŠããããšããäºå®ã«ãããŸãã å®éã«ã¯ã2ãã¯ã»ã«ãè¶ ããã·ããã§ã¯ããã€ã³ãæ°ã«é¢ä¿ãªãããã§ã«ååã«å€§ããªãšã©ãŒãçºçããŠããŸããã
ã¢ã«ãŽãªãºã ã®ãã1ã€ã®åŒ±ç¹ã¯ãããã§ãæ»ãããªé£ç¶é¢æ°ã§ã¯ãªããä»»æã®ãããã«ã¯é¢æ£çãªé¢æ°ãæ±ã£ãŠããããšã§ãã ãã®ãããç»åã®äžéšã®æçã§ã¯ã匷床ãæçœãªèŠåæ§ãªãã§ãããšãã°ãªããžã§ã¯ãã®å¢çã§ããŸãã¯ãã€ãºã®ããã«ãã¹ããããããå¯èœæ§ããããŸãã ãã®å Žåãé¢æ°gïŒxïŒã¯ãç¹ã®è¿ãã§ã®ç»åã®å€åãæ£ç¢ºã«èšè¿°ã§ããŸããã ãããïŒå°ãªããšãéšåçã«ïŒè§£æ±ºããã«ã¯ãå ã®ç»åãæ±ãããšããå§ãããŸããéåžžã«åŒ·ãæ±ãã®ã䟿å©ã§ããã€ãŸããå šå¡ã®ãæ°ã«å ¥ãã®ã¬ãŠã¹ãŒããïŒéã¿ä¿æ°ã«ããå¹³ååïŒã§ã¯ãªããåãããã¯ã¹ãã£ã«ã¿ãŒïŒãŠã£ã³ããŠå šäœã®åäžãªå¹³åââåïŒ ïŒãããã«ã¯æ°åç¶ããŠã ç»åã®æ»ãããã¯ã现éšãããéèŠã§ãã
ãã ãããããã®æ段ã«ãã£ãŠãæ€åºããã2ã3ãã¯ã»ã«ã®ã·ãããå¶éããããšãã§ããŸããã ãšããã§ãOpenCV 1.0ã§ã¯ããã®ãããªå åŠã¹ããªãŒã ã®å®è£ ããããéåžžã«å°ããªã·ããã§ã®çæ³çãªæ¡ä»¶ã§ã®ã¿æ©èœããŸããã
ã©ãããïŒ
å šäœã§æ®éã®ã«ãŒã«ã¹ã»ã«ããã¯ãå°ããªã·ãããæ確ã«å®çŸ©ããŠããããã®äžã®åçã¯ãã®ç·åœ¢è¿äŒŒã«äŒŒãŠããŸãã ãããå æããããã«ãæšæºã®CVãã¯ããã¯-ãã«ãã¹ã±ãŒãªã³ã°ã䜿çšããŸããç°ãªãã¹ã±ãŒã«ã®ç»åã®ããã©ãããããæ§ç¯ãïŒã»ãšãã©ã®å Žåãå軞ã§2åã«ã¹ã±ãŒãªã³ã°ãããã«ãŠã³ããããããªããŸãïŒãå°ããªç»åãã倧ããªç»åãžã®å åŠã¹ããªãŒã ã§ããããééããŸããã®åŸãå°ããªç»åã§æ€åºãããå°ããªã·ããã¯ã倧ããªç»åã§ã®å€§ããªã·ããã«å¯Ÿå¿ããŸãã æå°ã®ç»åã§ã¯ã1-2ãã¯ã»ã«ä»¥äžã®ã·ãããèŠã€ãããå°ããã¹ã±ãŒã«ãã倧ããã¹ã±ãŒã«ã«ç§»åããŸããåã®ã¹ãããã®çµæã䜿çšããŠãã·ããå€ã調æŽããŸãã å®éãOpenCVã§ã¯ãcalcOptFlowPyrLKé¢æ°ã«ãã£ãŠå®è£ ãããŸãã ãã®ãã©ãããã¢ã«ãŽãªãºã ã䜿çšãããšãå€ãã®ãã€ã³ãã§ç·åœ¢è¿äŒŒãèšç®ããå¿ èŠããªããªããŸãããã©ãããã®ã¬ãã«ãå¢ãããåã¬ãã«ã§ãã®é¢æ°ã®ããªã倧ãŸããªè¿äŒŒããšãæ¹ãç°¡åã§ãã ãããã£ãŠãOpenCVã§ã¯ã2ã€ã®é£æ¥ãã€ã³ãã®ã¿ã®èšç®ããããŸãã ãããã£ãŠããã®ã¢ã«ãŽãªãºã ã®å®è£ ã«é¢é£ããŠãå°é¢æ°ã«å¯Ÿããè¿äŒŒé¢æ°ã®å©ç¹ã«é¢ããçµè«ã¯åœ¹ã«ç«ããªãããšãå€æããŸããããã®ãããªæ°ã®å¶åŸ¡ç¹ã§ã¯ãå°é¢æ°ãæè¯ã®è¿äŒŒé¢æ°ã§ãã
ãããŠãä»ã«äœããããŸããïŒ
ãã®ã¢ã«ãŽãªãºã ã¯ãå æãèšç®ããããã®å¯äžã®ãªãã·ã§ã³ã§ã¯ãããŸããã OpenCVã«ã¯ãLucas-Canadaã¹ããªãŒã ã«å ããŠãFarnebackã¹ããªãŒã ãšSimpleFlowããããŸãããããã¯ããã°ãã°Horn â Schunckã¢ã«ãŽãªãºã ãæããŸãã
Horn â Schunckã¡ãœããã¯ãLucas-Canadaã¡ãœãããããå€å°ã°ããŒãã«ã§ãã ããã¯ãç»åå šäœã®å æãéåžžã«æ»ããã«ãªããšããä»®å®ã«åºã¥ããŠããŸãã åãæ¹çšåŒãã
![](https://habrastorage.org/getpro/habr/post_images/240/a53/130/240a531308dcc6d61a797f29f0d09b7d.gif)
![](https://habrastorage.org/getpro/habr/post_images/408/f58/8d3/408f588d3cb05bc7382f837ecc8ecf20.gif)
![](https://habrastorage.org/getpro/habr/post_images/17e/fbc/79a/17efbc79aea908239ef99a47018bce6e.gif)
![](https://habrastorage.org/getpro/habr/post_images/f38/e8c/b3a/f38e8cb3adc643694b4e08559e55d798.gif)
ãããã®æ¹çšåŒã§ã¯ãã©ãã©ã·ã¢ã³ã¯ãããèšç®ããããšãææ¡ããŸãïŒ
![](https://habrastorage.org/getpro/habr/post_images/e82/489/c96/e82489c96f4090512dfa656998a04c2f.gif)
![](https://habrastorage.org/getpro/habr/post_images/a34/68c/2e9/a3468c2e91b7c7e4f44cdd51b13f170a.gif)
![](https://habrastorage.org/getpro/habr/post_images/152/655/864/152655864a0daca7ecaf8baba9077b7a.gif)
ãã®ã¢ã«ãŽãªãºã ã§ã¯ããã«ãã¹ã±ãŒãªã³ã°ã䜿çšããããšãææ¡ãããŠãããç»åã2åã§ã¯ãªãã0.65ã®ä¿æ°ã§ã¹ã±ãŒãªã³ã°ããããšããå§ãããŸãã
ãã®ã¢ã«ãŽãªãºã ã¯ãOpenCVã®æåã®ããŒãžã§ã³ã§å®è£ ãããŸããããåŸã«æŸæ£ãããŸããã
Farnebackã¯ã2次圢åŒã䜿çšããŠè¿åã®åŒ·åºŠã®å€åãè¿äŒŒããããšãææ¡ããŸããïŒI = xAx + bx + c with symmetric matrix AïŒå®éãTaylorå±éã第1é ã«èæ ®ããŠãç·åœ¢è¿äŒŒI = bx + cãæ¡çšããŸããè¿äŒŒã®ç²ŸåºŠãäžããããšã«æ±ºããåæ°ïŒç»åããã®è¿åå ã§ã·ããããå Žåã
![](https://habrastorage.org/getpro/habr/post_images/cef/f63/791/ceff6379139b144d6d2c290118c7c8d5.gif)
![](https://habrastorage.org/getpro/habr/post_images/090/fa5/838/090fa58384ab43497db73237eb3a988e.gif)
![](https://habrastorage.org/getpro/habr/post_images/030/eba/ae7/030ebaae7c37805e0be02defef7b4244.gif)
![](https://habrastorage.org/getpro/habr/post_images/9d4/449/ebb/9d4449ebb384df15ef0853676772cdc9.gif)
ããã§ãäž¡æ¹ã®åçã®Aãbãcã®å€ãèšç®ã§ãããã®ã·ã¹ãã ã¯dã«é¢ããŠåé·ã«ãªãïŒç¹ã«æåã®åŒã¯ãããã«ããïŒãäžè¬ã«dã¯2çªç®ã®åŒããåŸãããŸãïŒ
![](https://habrastorage.org/getpro/habr/post_images/ef8/7cf/c7d/ef87cfc7d6261d21a899cf835ab7df3a.gif)
![](https://habrastorage.org/getpro/habr/post_images/203/301/bf3/203301bf395673df883b82488e29ca14.gif)
![](https://habrastorage.org/getpro/habr/post_images/b37/4b0/d2f/b374b0d2f529418ef08c5def9fe659b7.gif)
![](https://habrastorage.org/getpro/habr/post_images/b43/4e2/d0c/b434e2d0c3ae8e29e4249dc5c9aed27d.gif)
èšç®ã®ãã€ãºãè£æ£ããããã«ãæ€èšäžã®ãã€ã³ãã®è¿ãã§ã¯ããã¹ãŠã®ãã€ã³ããã»ãŒåãã·ãããæã£ãŠãããšããä»®å®ã«åã³æ»ããŸãã ãããã£ãŠããšã©ãŒãå床統åããŸã
![](https://habrastorage.org/getpro/habr/post_images/a7e/62d/483/a7e62d48343e482228cf72e68de75445.gif)
![](https://habrastorage.org/getpro/habr/post_images/771/272/648/77127264820430245399b7c058413ed9.gif)
![](https://habrastorage.org/getpro/habr/post_images/202/f32/3c0/202f323c016171111b818ae08b97ef6f.gif)
![](https://habrastorage.org/getpro/habr/post_images/98d/eec/6dd/98deec6ddd703117053247522a2da8af.gif)
ãã€ãã®ããã«ããã®ã¢ã«ãŽãªãºã ã«ã¯å€ãã®ä¿®æ£ãšæ¹åããããäž»ã«æ¢ç¥ã®ã¢ããªãªãªæ å ±ïŒãããŒã®æå®ã®åæè¿äŒŒïŒã®äœ¿çšãå¯èœã«ããåã³ãã«ãã¹ã±ãŒãªã³ã°ãå¯èœã«ããŸãã
SimpleFlowã¡ãœããã¯ã次ã®èãæ¹ã«åºã¥ããŠããŸããå°é¢æ°ãæ€çŽ¢ãããŠã£ã³ããŠã®ãµã€ãºä»¥äžã®ã·ããã決å®ããæ¹æ³ããŸã ããããªãå Žåããªãå°é¢æ°ã®èšç®ã«ç ©ããããã®ã§ããããã ãŠã£ã³ããŠå ã§æãé¡äŒŒãããã€ã³ããèŠã€ããŸãããïŒ ãŸãããããŸããã解決ãããã€ãºãè£æ£ããããã«ãæµããé£ç¶çã§ããããã®ãã€ã³ãã®è¿ãã§ã¯ãã¹ãŠã®ãã€ã³ããã»ãŒåãã·ãããæã€ããšãèæ ®ããŸãã ãŸãããŠã£ã³ããŠãµã€ãºã®åé¡ã¯ããã«ãã¹ã±ãŒãªã³ã°ã«ãã£ãŠåã³è§£æ±ºãããŸãã
ããå³å¯ã«ã¯ãã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãããŠã£ã³ããŠå ã®ãã¹ãŠã®ãã€ã³ãã«å¯ŸããŠãéå§ãã€ã³ããããã®ãã€ã³ããžã®é·ç§»ã®ç¢ºçã«ïŒé察æ°äŸåæ§ã§ïŒå¯Ÿå¿ããããšãã«ã®ãŒãã®é¢æ°ããããŸãã
![](https://habrastorage.org/getpro/habr/post_images/95a/5bb/1f2/95a5bb1f2de9ef34b6c376a4e85c3003.gif)
![](https://habrastorage.org/getpro/habr/post_images/829/bd8/f54/829bd8f541609108d50d8bd269f146de.gif)
ãããŠãããªãã匷ãã§ã¯ãªãå ŽåïŒ
äžèšã§ã¯ããã€ã³ãéã®å¯Ÿå¿ã¯ç°ãªãå€ã§æ±ºå®ã§ãããšèšãããŸãããããªã匷床ã ããèæ ®ããã®ã§ããïŒ ãããŠãä»ã®æ°éãæžããããšãã§ãããããé©åãªãã£ã«ã¿ãŒã§ç»åããã£ã«ã¿ãŒåŠçãããã£ã«ã¿ãŒåŠçãããç»åãäžèšã®ã¢ã«ãŽãªãºã ã®å ¥åã«éããŸãã ãããã£ãŠãå ã¹ããªãŒã ã䜿çšããå Žåã¯ããŸããã©ã®ç»åç¹æ§ãæ¡ä»¶ã®äžã§æãå®å®ããããèããé©åãªãã£ã«ã¿ãªã³ã°ãå®è¡ããŠããã®ç¹æ§ãã¢ã«ãŽãªãºã ã®å ¥åã§ã®åŒ·åºŠã«ãªããªãããã«ããŸãã
ç·Žç¿ãã
OpenCVãæäŸããã¢ã«ãŽãªãºã ãå®éã«è©ŠããŠã¿ãŸãããã
ããã§ã¯ãããŸããŸãªã·ãããå転ãå°åœ±å€æãã»ã°ã¡ã³ããããŸããŸãªãã€ãºãªã©ã䜿çšããŠããã©ã¡ãŒã¿ãå€æŽããå ¥åã·ãŒã±ã³ã¹ãå€æŽããŠãåã¢ã«ãŽãªãºã ã®ããŸããŸãªç 究ãè¡ãããšãã§ããŸããããã«ã¯æéãããããçŸåšã®èšäºã®ãµã€ãºãè¶ ããŸããããã£ãŠãããã§ã¯ãåºå®è·é¢ã®å°ããªç»åã·ãããšå°ããªãã€ãºã®åçŽãªå¹³è¡ç§»åã«éå®ããããšãææ¡ããŸãã ããã«ãããäžè¬çãªçšèªã§ã¢ã«ãŽãªãºã ã®å®è¡æ¹æ³ãšãããã®ã©ããããã¯ãŒã«ã§ããããç解ã§ããŸãã
æé ã®æ§æã¯ã ããã¥ã¢ã«ããŒãžã§è©³çŽ°ã«èª¬æãããŠããŸããããã§ã¯ãã³ã¡ã³ããšãšãã«squeeze-translationã瀺ããŸãã
åŸæ¥ã®Lucas-Canadaã¯ãcalcOpticalFlowPyrLKããã·ãŒãžã£ã«ãã©ããããå®è£ ããŠããŸãã ã¢ã«ãŽãªãºã ã¯ãã¹ããŒã¹ã¹ããªãŒã ãèšç®ããŸããã€ãŸããæåã®ç»åã®ç¹å®ã®ãã€ã³ãã»ããã«ã€ããŠã2çªç®ã®ç»åã®äœçœ®ãæšå®ããŸãã å ¥åãã©ã¡ãŒã¿ãŒã¯éåžžã«æçœã§ãïŒ2ã€ã®å ¥åç»åããã€ã³ãã®å ¥åããã³åºåã»ãããstatus-察å¿ãããã€ã³ããæ£åžžã«æ€åºããããã©ããã瀺ãåºåãã¯ãã«ãerr-察å¿ãããã€ã³ãã®æšå®èª€å·®ã®åºåãã¯ãã«ãWinSize-ã¬ãŠã¹å¹³åãçºçãããŠã£ã³ããŠã®ãµã€ãºã 21x21ãããã¯ããŸãæ©èœããŸãããmaxLevel-ãã©ãããã®ã¬ã€ã€ãŒæ°-1ãã€ãŸãæåŸã®ã¬ã€ã€ãŒã®æ°ãç§ã¯5ã€ã®åºæºãåããŸãã-ã·ããã決å®ããå埩ããã»ã¹ãçµäºããããã®æ¡ä»¶ïŒãšã©ãŒãå埩çã«æå°åããïŒ-ãã ãã©ã¡ãŒã¿Iã¯ããã©ã«ãããã©ã°ãå·Š - è¿œå ãã©ã°ã¯ãåæã®è¿äŒŒæ³ãŸãã¯éžæãããŒæšå®èª€å·®ãminEigThresholdãšããŠäœ¿çšããããšãã§ãã - åŸé éŸå€ãçž®éè¡åãšèããããã®äžãç§ã¯ããã©ã«ãã§å·Šã OpenCV 2.4.1以éã§ã¯ãäºåã«èšç®ãããã¹ã±ãŒãªã³ã°ç»åã®ãã©ãããã䜿çšããŠã¹ããªãŒã ãèšç®ã§ããŸãã
äœæ¥ã®çµæãå°èŠæš¡ããã³å€§èŠæš¡ãªã·ããã®äž¡æ¹ãæ£åžžã«å®å®ããŠæ€åºãããããªã倧ããªãã€ãºã«èããããšãã§ããŸããåäœæéã¯5å±€ãã©ãããïŒã³ã¢i7 950ïŒã§400ãã€ã³ãã§çŽ10 msã§ãã
ã¡ãªã¿ã«ããã®ã¢ã«ãŽãªãºã ã¯ãé«å¯åºŠããŒãžã§ã³ãšçããŒãžã§ã³ã®äž¡æ¹ã®GpuïŒCUDAïŒã«ãå®è£ ãããŠããŸãã
Farnebackã¹ããªãŒã ã¯calcOpticalFlowFarnebackããã·ãŒãžã£ã«ãã£ãŠå®è£ ãããé«å¯åºŠã¹ããªãŒã ãã€ãŸãåãã€ã³ãã®ã·ãããèšç®ãããŸãã ãã©ã¡ãŒã¿ãŒïŒå ¥åç»åããããŒãã®2ãã£ãã«ãããªãã¯ã¹åœ¢åŒã®åºåã¹ããªãŒã ãpyr_scaleã¯ãã©ãããã®ã¬ã€ã€ãŒéã®ã¹ã±ãŒã«ã®æ¯çã決å®ããŸããlevels-ãã©ãããã®ã¬ãã«æ°ãwinsize-å¹³ååããããŠã£ã³ããŠã®ãµã€ãºãiterations-åã¬ãã«ã§ã®å埩æ°ãpoly_n- Aããã³bã®å€ãæšå®ããå€é åŒã®ãµã€ãºãpoly_sigmaã¯åŸ®åãå¹³æ»åãããšãã®ã¬ãŠã¹ãŒããã®ã·ã°ããæšå¥šãã©ã¡ãŒã¿ãŒå€ã¯ããã¥ã¢ã«ã«ç€ºããããã©ã°ã¯è¿œå ãã©ã°ã§ããããšãã°ãåæè¿äŒŒã䜿çšã§ããŸã IXæµããŸãã¯ãã®ä»ã®ãŠã£ã³ããŠäžã§å¹³åã
ãã®ã¢ã«ãŽãªãºã ã¯ïŒç§ã®èŠ³å¯ã«ããã°ïŒå®å®æ§ãã¯ããã«äœããããªãåäžãªç»åãèŠéããããïŒæããã«ãåé¡ã¯å€±æãããã€ã³ãã®ãã£ã«ã¿ãªã³ã°ã®æ¬ åŠã§ãïŒã倧ããªã·ãããé©åã«å€æã§ããŸããã 512x512ã®ç»åã§600ããªç§åããã
SimpleFlowã¹ããªãŒã ã¯calcOpticalFlowSFããã·ãŒãžã£ãå®è£ ãïŒåã³ãé«å¯åºŠã¹ããªãŒã ãèšç®ãããŸãïŒãããã©ã«ãå€ã®ãªãå€ãã®ç¥ç§çãªãã©ã¡ãŒã¿ãŒãæã¡ãäžè¬çã«ãçŸæç¹ã§ã¯ããŒãžã®æ å ±ã¯éåžžã«ç°¡æœã«æäŸãããŸãã ãããç解ããŠã¿ãŸãããã æåã®3ã€ã¯å ¥åç»åã§ãåºå2ãã£ã³ãã«ã§ãã ã¬ã€ã€ãŒ-ãã©ãããå ã®ã¬ã€ã€ãŒã®æ°ãã€ãŸããå ã®ç»åãã¹ã±ãŒãªã³ã°ãããåæ°ã averageing_block_size-ãã¯ã»ã«ãšãã«ã®ãŒé¢æ°ãèšç®ãããŠã£ã³ããŠã®ãµã€ãºã max_flow-åã¹ãããã§æ±ºå®ã§ããããã«ããæ倧ã·ãããå®éããŠã£ã³ããŠã®ãµã€ãºã«ãã£ãŠæ±ºå®ãããŸãïŒintã§ããçç±ã¯å®å šã«ã¯æããã§ã¯ãããŸããïŒã ããã§åæ¢ããããããã«ããã€ãã®ãã©ã¡ãŒã¿ãŒãèšå®ããããšãã§ããŸããããããã®ããã€ãã®æå³ã¯ç§ãæãããŠããŸãã
ãã®ãµã€ãã¯ã calcOpticalFlowSFïŒframe1ãframe2ãflowã3ã2ã4ã4.1ã25.5ã18ã55.0ã25.5ã0.35ã18ã55.0ã25.5ã10ïŒã§å§ãŸã䜿çšäŸãæäŸããŸãã ;
ç§ã®ã¢ã«ãŽãªãºã ã¯ä»ã®ã¢ã«ãŽãªãºã ããããã£ãšé ãã512x512ã®ç»åã«ã€ãçŽ9ã12ç§ã§ãã äœæ¥ã®çµæã¯ããã¡ãŒã³ããã¯ããããã£ãšããããããã§ããå°ãªããšããåäžãªç»åã®å€åã¯ããæ確ã«å€æããã倧ããªå€åã®å Žåã¯ã¯ããã«ããŸãæ©èœããŸãã
çµè«
ãªããã£ã«ã«ã¹ããªãŒã ãã©ããã§äœ¿çšããå Žåã¯ããŸããããå¿ èŠãã©ãããèããŸããå€ãã®å Žåãããç°¡åãªæ¹æ³ã§å®è¡ã§ããŸãã èªåã§ãããŒãå®è£ ããããšã¯ãæ°åèããããŠããã ãã§ããåã¢ã«ãŽãªãºã ã«ã¯ãå€ãã®ããªãã¯ã埮åŠããæé©åããããŸãã , , OpenCV (, , ). SSE , , CUDA OpenCL . . (. . sparse ), calcOpticalFlowPyrLK, , . dense- calcOpticalFlowSF, . , calcOpticalFlowFarneback, , .
æåŠ
docs.opencv.org/modules/video/doc/motion_analysis_and_object_tracking.html
Pyramidal Implementation of the Lucas Kanade Feature Tracker. Description of the algorithm â Jean-Yves Bouguet
Two-Frame Motion Estimation Based on Polynomial Expansion â Gunnar Farneback
SimpleFlow: A Non-iterative, Sublinear Optical Flow Algorithm â Michael Tao, Jiamin Bai, Pushmeet Kohli, and Sylvain Paris
Horn-Schunck Optical Flow with a Multi-Scale Strategy â Enric Meinhardt-Llopis, Javier Sanchez
en.wikipedia.org/wiki/Optical_flow