1. OpenCVå ¥éïŒã³ã³ãã¥ãŒã¿ããžã§ã³ã®äžçãžã®ç¬¬äžæ©
ã³ã³ãã¥ãŒã¿ããžã§ã³ã¯ãã³ã³ãã¥ãŒã¿ãç»åãåç»ããäžçãç解ããããã®æè¡ã§ããç»ååŠçãšã¯ç°ãªããã³ã³ãã¥ãŒã¿ããžã§ã³ã¯ç»åã®è§£éã«éç¹ã眮ããå®äžçã®èŠèŠæ å ±ãåæããŠå ·äœçãªè¡åãå°ãåºããŸããèªåé転è»ã®ããã²ãŒã·ã§ã³ãé¡èªèšŒã·ã¹ãã ãæç©ã®èªåéžå¥ãªã©å€å²ã«ãããå¿çšãå¯èœã§ãã
OpenCVïŒOpen Source Computer Vision LibraryïŒã¯ãè±å¯ãªæ©èœãåããã³ã³ãã¥ãŒã¿ããžã§ã³çšã®ããã°ã©ãã³ã°ã©ã€ãã©ãªã§ãããªãŒãã³ãœãŒã¹ãšããŠæäŸãããŠãããç 究è ãéçºè ã«ããç»åèªèãåã远跡ãšãã£ãã¢ããªã±ãŒã·ã§ã³ã®å®è£ ãå¯èœã«ããŸããPythonãJavaãC++ãªã©ã®èšèªã«å¯Ÿå¿ããŠããããã©ãããã©ãŒã ã«äŸåããªã䜿ãããããé åã§ãã
å ¥éè ã«ãšã£ãŠã芪ãã¿ããããè±å¯ãªãªã³ã©ã€ã³ãªãœãŒã¹ãã³ãã¥ããã£ã®ãµããŒããéããŠè¶£å³ã®ãããžã§ã¯ãããå°éçãªç 究ã«è³ããŸã§ãå€æ¹é¢ã§ã®å©çšãæåŸ ã§ããŸãããã®èšäºã§ã¯ãOpenCVã®åºæ¬æŠå¿µããå¿çšãŸã§ãåããããã解説ããŠãããŸãã
1.1 ã³ã³ãã¥ãŒã¿ããžã§ã³ãšã¯ïŒ
ã³ã³ãã¥ãŒã¿ããžã§ã³ã¯ãã«ã¡ã©ãã»ã³ãµãŒããååŸããããžã¥ã¢ã«ããŒã¿ã解æãã人éã®èŠèŠãè¡ããããªèªèãã³ã³ãã¥ãŒã¿ãå®è¡ããæè¡ã§ããå ·äœçã«ã¯ãç©äœã®èå¥ããã¿ãŒã³èªèã3Dã¢ããªã³ã°ãšãã£ãã¿ã¹ã¯ãå«ãŸããŸããããã«ãããç°å¢ãèªèããŠé©åãªã¢ã¯ã·ã§ã³ããšãããšãå¯èœã«ãªããŸãã
å»çãã»ãã¥ãªãã£ããšã³ã¿ãŒãã€ã¡ã³ããšãã£ãé åã§ã®éèŠãé«ãŸã£ãŠãããææ°ã®ç 究ãå®çšåãããæè¡ã®äžæ žãæãåéãšããŠæ¥ã é²åããŠããŸããã·ã³ãã«ãª2Dç»åã®åŠçããè€éãª3Dç°å¢ã®ç解ãŸã§ãå¹ åºããã£ã¬ã³ãžããã®åéã«ã¯ååšããŸãã
ãã®åéã®é²æ©ã¯ãæ©æ¢°åŠç¿ã人工ç¥èœã®é²å±ã«ã圱é¿ãåãŒãããããã®æè¡ãšèåããããšã§ãããªãå¯èœæ§ãç§ããŠããŸããä»ããã³ã³ãã¥ãŒã¿ããžã§ã³ã¯ç§ãã¡ã®ç掻ã®ããŸããŸãªåŽé¢ã«äžå¯æ¬ ãªèŠçŽ ãšãªã£ãŠããŸãã
1.2 OpenCVã®æŽå²ãšéçºã®èæ¯
OpenCVã¯1999幎ã«ã€ã³ãã«ã«ãã£ãŠçºè¡šããããã®åŸã¢ã¯ãã£ããªã³ãã¥ããã£ã®æ¯æŽãåããŠæé·ããŸãããç®çã¯é«æ§èœãªã³ã³ãã¥ãŒã¿ããžã§ã³ã¢ããªã±ãŒã·ã§ã³ã®éçºãä¿é²ããããšã§ãããåæ¥çšéãšåŠè¡çšéã®åæ¹ã«åœ¹ç«ã€ããèšèšãããç£æ¥çãšåŠè¡çã®æ©æž¡ã圹ãšãªã£ãŠããŸãã
ãªãŒãã³ãœãŒã¹ã§ãããããäžçäžã®éçºè ãèªç±ã«ãœãŒã¹ã³ãŒãã«ã¢ã¯ã»ã¹ããæ¹è¯ãæ¡åŒµãè¡ããç°å¢ãæäŸãããŠããŸãããœãããŠã§ã¢ã®é²åã«ã¯ããã®ããã«ã³ãã¥ããã£ã«ããè²¢ç®ã倧ããªåœ¹å²ãæ ã£ãŠããŸãã
ãã®å®çžŸãšæ©èœã®æ¡å ã«ãããOpenCVã¯å€ãã®ãããžã§ã¯ãã§ããã¡ã¯ãã¹ã¿ã³ããŒããšãªã£ãŠããŸãã䜿ãããããšåŒ·åãªæ©èœã¯ãåŠçãå°é家ãåããå¹ åºããŠãŒã¶ãŒã«æ¯æãããŠãããä»åŸããã®å°äœã匷åããŠããããšãäºæž¬ãããŸãã
1.3 OpenCVã®äž»ãªæ©èœãšç¹åŸŽ
OpenCVã¯ç»ååŠçãšã³ã³ãã¥ãŒã¿ããžã§ã³ã®ããã®å€æ°ã®ã¢ã«ãŽãªãºã ãå æ¬ããŠãããããã«ã¯ç»åã®åºæ¬çãªæäœãããé¡èªèãç©äœè¿œè·¡ãç«äœæ ååŠçãªã©ãå«ãŸããŸããé«åºŠãªææ³ã®å®è£ ããµããŒããããŠãããããšãã°æ©æ¢°åŠç¿ã«åºã¥ããç»ååé¡ãååž°ãå¯èœã§ãã
æ©èœã®ã»ãšãã©ã¯ãé«åºŠã«æé©åãããC/C++ã³ãŒãã«ãã£ãŠæäŸãããŠããããªã¢ã«ã¿ã€ã ã¢ããªã±ãŒã·ã§ã³ã«ã察å¿ããé床ãšå¹çãå®çŸããŠããŸãããŸãã䜿ããããPythonã€ã³ã¿ãŒãã§ãŒã¹ãæäŸãããŠãããè¿ éãªãããã¿ã€ãã³ã°ãè¡ããŸãã
OpenCVã¯ãã¢ãžã¥ãŒã«åŒã®æ§é ãæã£ãŠãããããå¿ èŠãªæ©èœãéžæããŠçµã¿èŸŒãããšãã§ããŸããããã«ãããç¹å®ã®ãããžã§ã¯ãã«æé©åããã軜éãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšãå¯èœã«ãªããŸãã
1.4 OpenCVã§ã§ããããšïŒåºæ¬çãªçšé
OpenCVã䜿çšãããšãç»åãã£ã«ã¿ãªã³ã°ããšããžæ€åºã圢ç¶æ€åºã®ãããªåºæ¬çãªç»ååŠçã«å§ãŸããé¡èªèããžã§ã¹ãã£ãŒèå¥ãšãã£ãè€éãªã¿ã¹ã¯ãŸã§ãããªããŸãããŸããåç»ããã®ç©äœè¿œè·¡ãåäœè§£æã«ãå©çšãå¯èœã§ãç£èŠã·ã¹ãã ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®éçºã«å¯äžããŸãã
ããã«ãæ¡åŒµçŸå®ããããã£ã¯ã¹ã®åéã§ããã®äŸ¡å€ãçºæ®ããç°å¢ã®3Dãããã³ã°ãããã²ãŒã·ã§ã³ã·ã¹ãã ã®æ§ç¯ãå¯èœã«ããŸããããããå¿çšã¯ãç 究éçºãã補åéçºãŸã§ãå¹ åºãç¯å²ã§èŠãããšãã§ããŸãã
OpenCVã®æè»æ§ãšæ©èœã®è±å¯ãã«ãã£ãŠããšã³ãžãã¢ãç 究è ã¯è€éãªããžã§ã³ã¿ã¹ã¯ãæ軜ã«å®è£ ã§ããããã«ãªããŸãããã¹ã¿ãŒãã¢ãããã倧äŒæ¥ãæè²æ©é¢ã«è³ããŸã§ãããããèŠæš¡ã®ããŒã ãOpenCVã«ãã£ãŠåŒ·åãããŠããŸãã
2. OpenCVã®ã€ã³ã¹ããŒã«ãšèšå®
OpenCVïŒOpen Source Computer Vision LibraryïŒã¯ãã³ã³ãã¥ãŒã¿ããžã§ã³ãšæ©æ¢°åŠç¿ã«ãããå¹ åºãã¢ã«ãŽãªãºã ãæäŸãããªãŒãã³ãœãŒã¹ã®ã©ã€ãã©ãªã§ãããªã¢ã«ã¿ã€ã åŠçã念é ã«ãããŠèšèšãããŠãããã¢ã«ãããã¯ãªç 究ããåæ¥ãããžã§ã¯ããŸã§ãå€å²ã«ãããçšéã§å©çšãããŠããŸãã
ãã®ã©ã€ãã©ãªã䜿çšããã«ã¯ãé©åãªã€ã³ã¹ããŒã«ãšèšå®ãäžå¯æ¬ ã§ããæ§ã ãªãã©ãããã©ãŒã ãšããã°ã©ãã³ã°èšèªã§å©çšå¯èœã§ãããããããããã®ç°å¢ã«é©ããã»ããã¢ãããå¿ èŠãšãªããŸããèšäºãèªã¿é²ããããšã§ãOpenCVãã¹ã ãŒãºã«å§ããããã®ã¹ããããã€ã¹ãããã¬ã€ããåŠã¶ããšãã§ããã§ãããã
åããŠã®ã€ã³ã¹ããŒã«ã§ãã£ãŠãããã®ã¬ã€ããåèã«ããã°ãåºæ¬çãªèšå®ããé«åºŠãªèšå®ãŸã§ãå¿ èŠãªæ å ±ãææ¡ãå®è¡ããããšãã§ããŸããã§ã¯ãOpenCVã®äžçãžã®ç¬¬äžæ©ãäžç·ã«èžã¿åºããŸãããã
2.1 察å¿ãã©ãããã©ãŒã ãšèšèª
OpenCVã¯ãã«ããã©ãããã©ãŒã ã©ã€ãã©ãªã§ãããWindowsãmacOSãLinuxãå«ãè€æ°ã®ã·ã¹ãã ã§å©çšããããšãã§ããŸããå ããŠãC++ãã¯ãããšããPythonãJavaãªã©è€æ°ã®ããã°ã©ãã³ã°èšèªã®ãã€ã³ãã£ã³ã°ãæäŸããŠãããéçºè ã®ç°å¢ã奜ã¿ã«å¿ããŠéžæããããšãå¯èœã§ãã
çŸåšããã䜿ããããå¹ççãªéçºãæ¯æŽããããã«ãå€ãã®éçºè ãPythonãã€ã³ãã£ã³ã°ã«æ³šç®ããŠããŸããçç±ãšããŠã¯ãPythonã®ã·ã³ã¿ãã¯ã¹ã®ç°¡æœããšè¿ éãªãããã¿ã€ãã³ã°èœåãæããããŸããããããããã©ãŒãã³ã¹ãéèŠãããå Žåã«ã¯ãC++ãå©çšãããããšãäžè¬çã§ãã
ã©ã®èšèªããã©ãããã©ãŒã ãéžã¶ã«ãããOpenCVã³ãã¥ããã£ã¯å å®ããããã¥ã¡ã³ããšãµããŒããã©ãŒã©ã ãæäŸããŠããŸããåå¿è ããçç·Žã®éçºè ãŸã§ãããããã®ããŒãºã«çããããšãã§ããã§ãããã
2.2 WindowsãmacOSãLinuxã§ã®ã€ã³ã¹ããŒã«æ¹æ³
WindowsãmacOSãLinuxãšãã£ãã¡ãžã£ãŒãªãã©ãããã©ãŒã ã«ãããOpenCVã®ã€ã³ã¹ããŒã«ã¯ãããã€ãã®ã¹ãããã«åããããŸããWindowsã§ã¯ãPre-built binariesãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããããã»ã¹ãäžè¬çã§ããmacOSã«ãããŠã¯Homebrewãå©çšããã®ã䟿å©ã§ãLinuxã§ã¯apt-getãªã©ã®ããã±ãŒãžãããŒãžã£ãŒã䜿ã£ãæ¹æ³ãåºãæ¡çšãããŠããŸãã
ãã¹ãŠã®ãã©ãããã©ãŒã å ±éããŠãã€ã³ã¹ããŒã«åŸã¯ç°å¢å€æ°ã®èšå®ãå¿ èŠãšããŸããããã¯ã©ã€ãã©ãªããããžã§ã¯ãããæ£ããåç §ãããããã«ããããã§ããã°ãã°æ°ããªéçºè ãã€ãŸãããã€ã³ããšãªãå ŽåããããŸããOpenCVã®å ¬åŒããã¥ã¡ã³ãã¯ãã®ç¹ã«ãããŠã詳现ãªæ瀺ãæäŸããŠããŸãã
ãŸããçµ±åéçºç°å¢ïŒIDEïŒã§ããVisual StudioãEclipseã䜿çšããŠããå Žåãã©ã€ãã©ãªã®ãã¹ãæå®ããå¿ èŠããããŸããããã¯ãããžã§ã¯ãã®èšå®éšåã§è¡ãããšãã§ããŸãããå ·äœçãªæé ã¯äœ¿çšããIDEã«ãã£ãŠç°ãªããããããããã®ããã¥ã¡ã³ãã«åŸã£ãŠè¡ãããšãéèŠã§ãã
2.3 OpenCVãå©çšããããã®åæç¥è
OpenCVã䜿çšããåã«ãããã€ãã®åæç¥èãæ±ããããŸãããŸãåºæ¬çãªããã°ã©ãã³ã°ã¹ãã«ãå¿ èŠã§ãããç¹ã«C++ãPythonã®ç¥èããããšã¹ã ãŒãºã«é²ããããšãã§ããŸãããŸããç»ååŠçãã³ã³ãã¥ãŒã¿ããžã§ã³ã®åºç€çãªç解ãéåžžã«åœ¹ç«ã¡ãŸãã
ç»ååŠçã«é¢é£ããã¢ã«ãŽãªãºã ãæ°åŠçãªæŠå¿µã«ææ§ããããå Žåã¯ããããã®åŠç¿ãå§ããããšããå§ãããŸããããã«ã¯ãããªãã¯ã¹æäœãè²ç©ºéããšããžæ€åºãªã©ãå«ãŸããŸãããããã®æŠå¿µãç解ããããšã§ãOpenCVãæäŸããé¢æ°ã®èåŸã«ããçè«ãããããç解ã§ããããã«ãªããŸãã
å ããŠãã³ã³ãã¥ãŒã¿ããžã§ã³ãããžã§ã¯ããé²ããã«ããã£ãŠã¯ãã¢ã«ãŽãªãºã ã®éžæããã¥ãŒãã³ã°ãçµæã®è©äŸ¡æ¹æ³ãªã©ãåé¡è§£æ±ºã«ãããæŠç¥çãªã¹ãã«ãæ±ããããŸãããããã¯ãã°ãã°ãããžã§ã¯ãåºæã®ãã®ã§ãæç®ãã³ãã¥ããã£ãã©ãŒã©ã ã®ãªãœãŒã¹ã掻çšããããšã§åäžãããããšãã§ããŸãã
2.4 æåã®ãããžã§ã¯ãèšå®ãšãµã³ãã«ã³ãŒãã®å®è¡
ç°å¢æ§ç¯ãå®äºããããæåã®ãããžã§ã¯ããäœæãããµã³ãã«ã³ãŒãã®å®è¡ãéããŠOpenCVãäœéšããããšãã§ããŸããäžè¬çã«ãOpenCVãããŠã³ããŒãããéã«ã¯å€æ°ã®ãµã³ãã«ã³ãŒããå«ãŸããŠãããããããå©çšããŠã©ã€ãã©ãªã®åºæ¬çãªäœ¿çšæ³ãåŠã¶ããšãã§ããŸãã
åããŠã®ãããžã§ã¯ãã§ã¯ãåçŽãªç»åã®èªã¿èŸŒã¿ãšè¡šç€ºãåºæ¬çãªç»åæäœãè¡ãããã°ã©ã ãäœæãããšããããå§ããã®ãè¯ãã§ããããããã«ãã£ãŠãOpenCVã®APIã®äœ¿çšæ¹æ³ãšãç»åããŒã¿ãžã®åºæ¬çãªã¢ã¯ã»ã¹æ¹æ³ãç解ããããšãã§ããŸãã
è©Šè¡é¯èª€ãéããããšã§ãè¿ éã«åŠç¿ãšéææãåŸãããšãã§ããã§ãããããŸããå®è¡ãæåããããã³ãŒããé©åã«ããã¥ã¡ã³ãåããåŒãç¶ãåŠç¿ã®è³æãšããŠæŽ»çšããããšãå¿ããªãã§ãã ãããOpenCVã®äœ¿ãæ¹ãç¿åŸããã«ã¯å®è·µãæãå¹æçãªæ段ã§ãã
3. OpenCVã®åºæ¬çãªäœ¿ãæ¹
3.1 ç»åã®èªã¿èŸŒã¿ã衚瀺ãä¿å
OpenCVã䜿çšããŠç»åãæ±ãæåã®ã¹ãããã¯ãç»åã®èªã¿èŸŒã¿ããå§ãŸããŸããããã¯cv2.imread()
é¢æ°ã䜿ã£ãŠè¡ãããåŒæ°ã«ã¯èªã¿èŸŒãç»åã®ãã¡ã€ã«ãã¹ãæå®ããŸããèªã¿èŸŒãã ç»åã¯ãcv2.imshow()
ã¡ãœããã«ãã£ãŠãŠã£ã³ããŠäžã«è¡šç€ºããããšãã§ããŸãã衚瀺åŸã¯ãcv2.waitKey()
ãåŒã³åºããŠãä»»æã®ããŒå
¥åããããŸã§è¡šç€ºãç¶ããããšãã§ããŸãã
ç»åã®ä¿åã«ã¯cv2.imwrite()
ãçšããŸãã第äžåŒæ°ã«ä¿åããããã¡ã€ã«åã第äºåŒæ°ã«ä¿åããç»åãªããžã§ã¯ããæå®ããŸãããããã®æ©èœã䜿ãããšã§ãç»åã®æ±ãã«é¢ããåºæ¬çãªæäœãè¡ãããšãå¯èœã§ãã
å¹ççãªSEOã®ããã«ããããã®ããŒã¯ãŒããé©åãªæèã§äœ¿çšããããšã¯æ€çŽ¢ãšã³ãžã³ã«ãããèšäºã®ã©ã³ãã³ã°åäžã«ã€ãªãããŸããOpenCVã§ã®ç»åã®èªèŸŒã衚瀺ãä¿åã¯ãæ§ã ãªç»ååŠçã¢ããªã±ãŒã·ã§ã³ã®åºç€ãšãªããŸãã
3.2 ãããªã®ãã£ããã£ãšåŠç
ãããªã¹ããªãŒã ã®ãã£ããã£ã«ã¯cv2.VideoCapture()
ã䜿çšããŸããããã«ã¯ãã«ã¡ã©ããã€ã¹ã®ã€ã³ããã¯ã¹çªå·ãŸãã¯ãããªãã¡ã€ã«ã®ãã¹ãåŒæ°ãšããŠäžããããšãã§ããŸãããã£ããã£ãããããªãã¬ãŒã ã¯ããã¬ãŒã ããšã«èªã¿èŸŒã¿ãåŠçãè¡ãããšãäžè¬çã§ãã
ãããªãã¬ãŒã ã®åŠçãšããŠã¯ããªã¢ã«ã¿ã€ã ã§ã®ãªããžã§ã¯ã远跡ãé¡æ€åºãªã©ãè¡ãããŸãããããªããŒã¿ãæ±ãéã«ã¯ã«ãŒãåŠçãçšããããããšãå€ããcv2.waitKey()
é¢æ°ãšçµã¿åãããŠãç¹å®ã®ããŒãæŒãããæã«ã«ãŒããæããããå¶åŸ¡ããããšãäžè¬çã§ãã
ãããªã®ãã£ããã£ãšãã®åŸã®åŠçã¯ãã»ãã¥ãªãã£ã·ã¹ãã ããã©ãã£ãã¯ã¢ãã¿ãªã³ã°ãã€ãã³ãèšé²ãªã©æ§ã ãªå¿çšããããŸããOpenCVã䜿ãã°ãããã®ã¢ããªã±ãŒã·ã§ã³ã容æã«å®è£ ããããšãå¯èœã§ãã
3.3 åºæ¬çãªç»ååŠçïŒãã£ã«ã¿ãªã³ã°ãè²ç©ºéå€æãªã©ïŒ
ç»ååŠçã«ã¯ããã£ã«ã¿ãªã³ã°ãè²ç©ºéå€æãšãã£ãåºæ¬çãªåŠçãå«ãŸããŸãããã£ã«ã¿ãªã³ã°ã«ã¯ããã€ãºã®é€å»ããšããžã®æ€åºããŒããïŒå¹³æ»åïŒãªã©ããããããããcv2.filter2D()
ãcv2.Canny()
ãcv2.GaussianBlur()
ãªã©ã®é¢æ°ãçšããããŸãã
è²ç©ºéå€æã¯ãäŸãã°RGBã«ã©ãŒããã°ã¬ãŒã¹ã±ãŒã«ãHSVã«å€æããããšã§ãç¹å®ã®ç»ååŠçã容æã«ããããè²ã«åºã¥ããŠãªããžã§ã¯ããèå¥ãããããã®ã«åœ¹ç«ã¡ãŸããããã«ã¯cv2.cvtColor()
é¢æ°ã䜿ãããŸãã
ãããã®æè¡ã¯ãç»å解æãèªåè»ã®é転æ¯æŽã·ã¹ãã ãå»çç»ååŠçãªã©å€ãã®åéã§åºãå¿çšãããŠããŸããOpenCVã«ããç»ååŠçã®åºæ¬ã¯ããããã®åºç¯ãªã¢ããªã±ãŒã·ã§ã³ãæ¯ããéèŠãªèŠçŽ ã§ãã
3.4 å³åœ¢ã®æç»ãšããã¹ãã®æžã蟌ã¿
OpenCVã䜿çšãããšãç»åäžã«çŽç·ãåãç©åœ¢ãå€è§åœ¢ãªã©ã®å³åœ¢ãæç»ããããšããç»åäžã«ããã¹ããæžã蟌ãããšãã§ããŸããå³åœ¢ã®æç»ã¯cv2.line()
ãcv2.circle()
ãcv2.rectangle()
ãcv2.polylines()
ãšãã£ãé¢æ°ãå©çšããããšã§å®çŸã§ããŸãã
ãŸããããã¹ãã®æžã蟌ã¿ã«ã¯cv2.putText()
é¢æ°ã䜿çšããŸããããã«ããæå®ãããã©ã³ããšã¹ã±ãŒã«ã§ç»åäžã«ããã¹ããæç»ã§ããŸãããããã®æ©èœã¯ãç»å解æçµæã®å¯èŠåã泚éä»ãã«äŸ¿å©ã§ãã
ãŠãŒã¶ãŒãç»åã«çŽæçãªæ å ±ãè¿œå ãããå ŽåãOpenCVã¯ããã容æã«ããŸããç»åäžã«å³åœ¢ãããã¹ããè¿œå ããããšã«ãã£ãŠãå¯èŠåããã¬ãŒã³ããŒã·ã§ã³ã«éããŠãããè±ããªæ å ±ãæäŸããããšãã§ããŸãã
4. ç»åèªèãšæ©æ¢°åŠç¿ã®çµ±å
è¿å¹Žãã«ã¡ã©æè¡ãç®åºææ³ã®é²åã«ãããã³ã³ãã¥ãŒã¿ãŒã«ããç»åèªèã泚ç®ãããŠããŸããç»åèªèãšæ©æ¢°åŠç¿ã®çµ±åã¯ãç¹ã«ã»ãã¥ãªãã£ãå»çãèªåé転è»ãªã©æ§ã ãªåéã§éèŠãšãªã£ãŠããŸããããã«ãããã·ã¹ãã ã¯äžæã®ç»åããè€éãªæ å ±ãæœåºããèªåŸçãªå€æãäžãããšãå¯èœã«ãªããŸãã
æ©æ¢°åŠç¿ã¢ã«ãŽãªãºã ã®é²æ©ã¯ãç»åããŒã¿ããã®åŠç¿ãæ¹åãã以åã«æ¯ã¹ãŠããé«ã粟床ã§ç¹åŸŽãæããããšãå¯èœã«ããŸããããã®ãããªã¢ã«ãŽãªãºã ã¯ãé¡èªèããªããžã§ã¯ãæ€åºãªã©ãè€éãªã¿ã¹ã¯ã«å¯ŸããŠãæå¹ã§ãã
ããã§ã¯ãOpenCVãäžå¿ã«ãç»åèªèãšæ©æ¢°åŠç¿ãã©ã®ããã«çµ±åãããçŸå®äžçã®ã¢ããªã±ãŒã·ã§ã³ã«å©çšãããŠããã®ããæãäžããŠãããŸãã
4.1 é¡èªèã®åºç€ãšå¿çš
é¡èªèæè¡ã¯ãå人èå¥ã®æãçŽæçãªæ¹æ³ã®äžã€ã§ããããžã¿ã«ç»åããããªãã人éã®é¡ãèå¥ãããã®ç¹åŸŽãåŠç¿ã»èªèããããšãå¯èœã§ããOpenCVã¯ãã®åéã§å¹ åºã掻çšãããŠãããæ§ã ãªã¢ã«ãŽãªãºã ãå®è£ ãããŠããŸãã
å¿çšäŸãšããŠã¯ãã¹ããŒããã©ã³ã®ããã¯è§£é€ããå ¬å ±ã®å®å šãå®ãç£èŠã«ã¡ã©ã·ã¹ãã ãªã©ããããŸãããããã·ã¹ãã ã¯ãå®éã®ç°å¢ã§ãªã¢ã«ã¿ã€ã ã§é¡ãèªèããããšãæ±ããããããã粟床ãšé床ãéåžžã«éèŠã§ãã
ãã®åéã®äžã€ã®å€§ããªé²æ©ã¯ããã£ãŒãã©ãŒãã³ã°æè¡ã®å¿çšã«ãããåŸæ¥ã®ã¢ã«ãŽãªãºã ã倧ããäžåã粟床ãå®çŸããŠããç¹ã§ããOpenCVã®å©çšè ã¯ã容æã«ãããã®é«åºŠãªã¢ã«ãŽãªãºã ã掻çšããããšãã§ããŸãã
4.2 ãªããžã§ã¯ãæ€åºãšèå¥
ãªããžã§ã¯ãæ€åºã§ã¯ãç»åå ã®ãªããžã§ã¯ãã®ååšãšãã®äœçœ®ãç¹å®ããæè¡ã§ããããã¯ãé¡èªèãšäžŠãã§ãå®å šé転æ¯æŽã·ã¹ãã ãããããå·¥åŠãªã©ãå€å²ã«ãããã¢ããªã±ãŒã·ã§ã³ã§å©çšãããŸãã
èå¥ããã»ã¹ã¯ãæ€åºããããªããžã§ã¯ããäœã§ãããã詳现ã«ç解ããããã«è¡ãããŸããããšãã°ãèªåé転è»ã¯åšå²ã®è»ãæ©è¡è ãé害ç©ãèå¥ããªããã°ãªããŸãããOpenCVã¯ãããã®ã¿ã¹ã¯ãå®çŸããããã®å€æ°ã®æ©èœãšã¢ã«ãŽãªãºã ãæäŸããŠããŸãã
è¿å¹Žã®é²åã«ããããããŸã§ä»¥äžã«è€éãªãªããžã§ã¯ããã·ãŒã³ã«å¯ŸããŠããé«ã粟床ã§æ€åºã»èå¥ãè¡ãããšãã§ããããã«ãªã£ãŠããŸãã
4.3 OpenCVãšæ©æ¢°åŠç¿ã©ã€ãã©ãªã®çµã¿åãã
OpenCVã¯ãã€ãã£ãã§å€ãã®æ©æ¢°åŠç¿æ©èœãå«ãã§ããŸãããTensorFlowãPyTorchãªã©ã®å°éçãªæ©æ¢°åŠç¿ã©ã€ãã©ãªãšçµã¿åãããããšã§ããã®æ©èœã¯ãã匷åãããŸãããã®ããã«ããŠãããè€éãªç»åèªèã¿ã¹ã¯ã«åãçµãããšãå¯èœã«ãªããŸãã
ããšãã°ãOpenCVã§åŸãããç»åããŒã¿ãååŠçããTensorFlowãPyTorchã§æ§ç¯ããããã¥ãŒã©ã«ãããã¯ãŒã¯ãçšããŠåé¡ãæ€åºãè¡ãã¯ãŒã¯ãããŒãäžè¬çã§ãããã®ããã»ã¹ã«ãããç²åºŠã®é«ãããŒã¿è§£æãå¯èœã«ãªããŸãã
ãŸããäž¡ã©ã€ãã©ãªã®çµã¿åããã¯ãç 究è ãéçºè ã«ãšã£ãŠæè»æ§ããããããæ§ã ãªã«ã¹ã¿ãã€ãºãæ¡åŒµãè¡ãããããæé©ãªãœãªã¥ãŒã·ã§ã³ãèŠã€ãããããªã£ãŠããŸãã
4.4 ãã£ãŒãã©ãŒãã³ã°ãçšããé«åºŠãªç»ååæ
ãã£ãŒãã©ãŒãã³ã°ã¯ãç»åèªèæè¡ã«é©åœããããããŸãããç³ã¿èŸŒã¿ãã¥ãŒã©ã«ãããã¯ãŒã¯ïŒCNNïŒãªã©ã®ã¢ã«ãŽãªãºã ã¯ãç»åå ã®è€éãªãã¿ãŒã³ãç解ããããšã«ç¹åããŠããŸããããã«ãããåŸæ¥ã®ã¢ã«ãŽãªãºã ã§ã¯äžå¯èœã ã£ãèªèã¿ã¹ã¯ãå®çŸããŠããŸãã
OpenCVã¯ããã£ãŒãã©ãŒãã³ã°ã¢ãã«ã®å®è£ ãšå©çšã容æã«ããããã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŠããŸããããã«ãããéçºè ã¯æå 端ã®ç 究ãå¿çšããæ°ããªèªèã·ã¹ãã ã®æ§ç¯ãå¯èœã«ãªããŸãã
è€éãªç»ååæãæ±ããã¿ã¹ã¯ã§ã¯ããã£ãŒãã©ãŒãã³ã°ãäžå¿ãšãªããOpenCVã¯ããããµããŒãããéèŠãªããŒã«ãšãªã£ãŠããŸãããã®çµæãå»çç»ååæãã»ãã¥ãªãã£ã·ã¹ãã ãèªåãã©ã€ãã³ã°ãªã©ãå€ãã®åéã§é«åºŠãªç»å解æãè¡ãããããã«ãªããŸããã
5. è€éãªç»ååŠçãšãã©ããã³ã°æè¡
è€éãªç»ååŠçãšãã©ããã³ã°æè¡ã¯ãçŸä»£ã®ã³ã³ãã¥ãŒã¿ããžã§ã³åéã®äžå¿ã§ãããããã®æè¡ã¯ãæ§ã ãªå¿çšåéã§éèŠãªåœ¹å²ãæãããŠãããOpenCVã¯ããããå®çŸããããã®åºç€ãæäŸããŠããŸãã
OpenCVã¯ãç»ååŠççšã®ãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªãšããŠç¥ããããã®è±å¯ãªæ©èœã»ããã«ãã£ãŠãã³ã³ãã¥ãŒã¿ããžã§ã³ã®å°é家ãç 究è ãã¡ããæ Œå¥ã®è©äŸ¡ãåããŠããŸãããã®ã©ã€ãã©ãªã¯ãç»åããæçãªæ å ±ãæœåºãããªã¢ã«ã¿ã€ã ã§åçãªç°å¢ãç解ããããã®åºç€ãšãªã£ãŠããŸãã
ããã§ã¯ãOpenCVãæäŸããããã€ãã®éèŠãªç»ååŠçãšãã©ããã³ã°æè¡ã«ã€ããŠãåºæ¬æŠå¿µããå¿çšã«è³ããŸã§ã解説ããŸãããããã®æè¡ã®ç解ã¯ãç 究ãéçºãããžã§ã¯ããããã«ã¯åæ¥çšã¢ããªã±ãŒã·ã§ã³ã®èšèšã«ã圹ç«ã¡ãŸãã
5.1 ç¹åŸŽç¹æ€åºãšãããã³ã°
ç¹åŸŽç¹æ€åºã¯ãç»åå ã®é¡èãªç¹ãèå¥ããããããä»ã®ç»åãšæ¯èŒå¯èœã«ããããã»ã¹ã§ããOpenCVã«ã¯ãSIFTãSURFãORBãšãã£ãæ§ã ãªç¹åŸŽç¹æ€åºã¢ã«ãŽãªãºã ãå®è£ ãããŠãããé«åºŠãªç»å解æããªããžã§ã¯ãã®èå¥ãå¯èœã«ãªã£ãŠããŸãã
ãããã®ã¢ã«ãŽãªãºã ã¯ãç»åå ã§äžææ§ãšå ç¢æ§ãæã£ãç¹åŸŽç¹ãæ€åºããç»åã®ã¹ã±ãŒã«ãå転ã«åœ±é¿ãããªãããã«èšèšãããŠããŸãããŸãããããã³ã°ããã»ã¹ã§ã¯ãæ§ã ãªç»åéã§å ±éã®ç¹åŸŽç¹ãèŠã€ãåºãããããå©çšããŠç»åéã®é¢é£æ§ãææ¡ããããšãã§ããŸãã
ç¹åŸŽç¹ã®æ€åºãšãããã³ã°ã¯ãããã©ãç»åã®äœæã3Dã¢ããªã³ã°ããªããžã§ã¯ããã©ããã³ã°ãšãã£ãå¿çšæè¡ã®æ žãšãªãèŠçŽ ã§ããOpenCVãæäŸãããããã®åŒ·åãªããŒã«ã掻çšããããšã§ãçŸå®äžçã®è€éãªèª²é¡ã«å¯Ÿå¿ã§ããŸãã
5.2 åãæšå®ãšå æµæ³
åãæšå®ã¯ãé£ç¶ããç»åãã¬ãŒã éã§ã®ç©äœã®åããç解ããããã®ããã»ã¹ã§ããå æµæ³ã¯ããã®åãæšå®ã®äžè¬çãªã¢ãããŒãã§ãããç»åå ã®åãã¯ã»ã«ãæéãšãšãã«ã©ã®ããã«ç§»åããããèšç®ããŸãã
OpenCVã¯ãLucas-Kanadeæ³ãGunnar Farnebackæ³ãšãã£ããç°ãªãå æµã¢ã«ãŽãªãºã ãåããŠãããããã«ãã£ãŠããã°ã©ããŒã¯åãã®ãã¿ãŒã³ãæ£ç¢ºã«æœåºããããšãã§ããŸãããããã®ã¢ã«ãŽãªãºã ã¯ã远跡ãã¢ãŒã·ã§ã³è§£æããããªå§çž®ãªã©ã®é åã§ã®å¿çšã«äžå¯æ¬ ã§ãã
æ£ç¢ºãªåãæšå®ã«ãããè»äž¡ãæ©è¡è ã®è¿œè·¡ããããªããã®å®å®åãã¢ã¯ãã£ããã£èªèãšãã£ãæ©èœãå®çŸããåºç€ãç¯ãããšãã§ããŸããOpenCVã®å æµæ³ã¢ã«ãŽãªãºã ã¯ããããå€å²ã«ãããã¢ããªã±ãŒã·ã§ã³ã«ãããŠãé«ãããã©ãŒãã³ã¹ãçºæ®ããŸãã
5.3 3Dåæ§æãšã¹ãã¬ãªããžã§ã³
3Dåæ§æã¯ã2Dç»åãã3Dã®äžçã埩å ããããã®æè¡ã§ããã¹ãã¬ãªããžã§ã³ã¯ããã®ããã»ã¹ã«ãããäžã€ã®éèŠãªææ³ã§ã2ã€ã®ã«ã¡ã©ã§æ®åœ±ãããç»åãå©çšããŠãç©äœã®æ·±åºŠæ å ±ãèšç®ããŸãã
OpenCVã¯ãã¹ãã¬ãªãããã³ã°ã¢ã«ãŽãªãºã ãšãããã«åºã¥ã深床ãããã®çææ段ãæäŸããŠãããããããå·¥åŠãèªåé転è»ãªã©ã®åéã§å©çšãããŠããŸããããã«ãããç°å¢ã3次å ã§ç解ããç©äœãæ€åºããäœçœ®ãç¹å®ããããšãå¯èœã«ãªããŸãã
ããã«ãã¹ãã¬ãªããžã§ã³æè¡ã¯ãããŒãã£ã«ãªã¢ãªãã£ãæ¡åŒµçŸå®ãã²ãŒã éçºãªã©ã®ãšã³ã¿ãŒãã€ã³ã¡ã³ãç£æ¥ã«ãé©æ°ããããããŠããŸãããããã®æè¡ã«ãã£ãŠããªã¢ã«ã¿ã€ã ã§ã®ã€ã³ã¿ã©ã¯ãã£ããªäœéšãå¯èœã«ãªãããããªãå¿çšãæåŸ ãããŠããŸãã
5.4 ãªã¢ã«ã¿ã€ã ãã©ããã³ã°ã·ã¹ãã ã®æ§ç¯
ãªã¢ã«ã¿ã€ã ã§åçãªå¯Ÿè±¡ã远跡ããããã®ãã©ããã³ã°ã·ã¹ãã ã¯ãå®å šç£èŠãã€ã³ã¿ã©ã¯ãã£ãã¡ãã£ã¢ãç¹æ®å¹æãªã©ãããŸããŸãªåéã§äžå¯æ¬ ã§ãããããæ§ç¯ããã«ã¯ãé«éã§ç²Ÿç¢ºãªåŠçèœåãæ±ããããŸãã
OpenCVã¯ããªã¢ã«ã¿ã€ã ã§ã®é«æ§èœãªãã©ããã³ã°ã¢ã«ãŽãªãºã ãè€æ°æäŸããŠãããããã°ã©ããŒã¯ããããå©çšããŠãè¿ éãªåãã®æšå®ãç©äœã®ææ¡ãå®çŸããã·ã¹ãã ãæ§ç¯ããããšãã§ããŸãããããã®ã¢ã«ãŽãªãºã ã¯ãã«ã¹ã¿ãã€ãºæ§ãé«ããæ§ã ãªçšéãæ¡ä»¶ã«å¿ããŠæé©åããããšãå¯èœã§ãã
ãªã¢ã«ã¿ã€ã ã§ã®ãã©ããã³ã°ããŒãºã«å¿ããããã«ã¯ãOpenCVã®æäŸããæ©èœãçµã¿åããã匷åºãªãã©ããã³ã°ã·ã¹ãã ãäœãäžããããšãéèŠã§ãããŠãŒã¶ãŒãå®çŸãããç¹å®ã®ãã©ããã³ã°ã®èŠä»¶ã«å¿ããŠãæé©ãªããŒã«ãšã¢ã«ãŽãªãºã ãéžæããå¹æçãªã·ã¹ãã ãèšèšããããšãã§ããŸãã
6. OpenCVã®æé©åãšããã©ãŒãã³ã¹
OpenCVã¯ã³ã³ãã¥ãŒã¿ããžã§ã³ã®ãããžã§ã¯ãã«ãããŠé«æ§èœãèŠæ±ããããããæé©åãšããã©ãŒãã³ã¹ã¯éèŠãªãã€ã³ãã§ããå¹ççãªã³ãŒããæžãããšã䞊ååŠçãGPUå éãç¥ãããšãããã©ãŒãã³ã¹ã枬å®ãããã«ããã¯ãåæããããšããªãœãŒã¹ã«å¶çŽãããç°å¢ã§ã®æŠç¥ç«ãŠãªã©ãããããæé©åãå®çŸããããã®éµãšãªããŸãã
6.1 å¹ççãªã³ãŒãã®æžãæ¹
å¹ççãªã³ãŒãã¯èšç®è³æºãç¯çŽããªããåŠçé床ãåäžãããŸããå ·äœçã«ã¯ãã¢ã«ãŽãªãºã ã®éžæãé©åãªããŒã¿æ§é ã®äœ¿çšãåé·ãªèšç®ã®æé€ãæããããŸããOpenCVã掻çšããŠçŽ æ©ãçµæãåŸããå Žåããããã®æè¡ã¯å¿ é ã§ãã
äŸãã°ãç¹°ãè¿ãè¡ãããåŠçã«ã¯ã«ãŒãã®ä»£ããã«ãã¯ãã«åãããæäœãçšããã¹ãã§ããããã¯ãåäžã®æäœã§ããŒã¿ã®å€§ããªãããã¯ã«å¯ŸããŠèšç®ãè¡ãããšãæããåŠçé床ãé£èºçã«åäžããŸãããŸããç»ååŠçã«ãããŠã¯ãäºåã«å¿ èŠãªç»åãµã€ãºãèšç®ããäžå¿ èŠãªãªãµã€ãºæäœãæžããããšãéèŠã§ãã
ã³ãŒãã¬ãã¥ãŒãè¡ããååãã³ãã¥ããã£ãšç¥èŠãå ±æããããšããæé©ãªã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ã身ã«ã€ããäžã§åœ¹ç«ã¡ãŸããç¶ç¶çãªåŠç¿ãšçžäºã®ãã£ãŒãããã¯ã¯ãããå¹æçãªã³ãŒããžãšå°ããŸãã
6.2 OpenCVã®äžŠååŠçãšGPUå é
OpenCVã¯ãã«ãã¹ã¬ããã£ã³ã°ãšGPUãå©çšããåŠçããµããŒãããŠãããããã«ããé«éãªç»ååŠçãå®çŸããŸããç¹ã«å€§å®¹éã®ããŒã¿åŠçããªã¢ã«ã¿ã€ã ã§ã®åŠçãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã«ãããŠããã®å¹æã¯é¡èã§ãã
䞊ååŠçã§ã¯ãè€æ°ã®CPUã³ã¢ãå©çšããŠã¿ã¹ã¯ãåå²ããåæã«åŠçãè¡ããŸããããã«ãããèšç®æéãå€§å¹ ã«åæžã§ããŸããGPUå éã«ãããŠã¯ãæ°åã®å°ããªã³ã¢ãååããŠå€§éã®æŒç®ã䞊åã«åŠçããããšã§ã巚倧ãªèšç®èœåãæäŸããŸãã
OpenCVã¯CUDAãOpenCLãä»ããŠGPUã掻çšããã¢ã«ãŽãªãºã ãå®è£ ããŠããŸããCPUã ãã§ã¯å®çŸãã¥ããåŠçããGPUã®åãåããããšã§ã¹ã ãŒãºãã€è¿ éã«è¡ãããšãå¯èœã§ããããããå šãŠã®åŠçãGPUã«é©ããŠããããã§ã¯ãªãããã䜿çšç¶æ³ãåå³ããå¿ èŠããããŸãã
6.3 ããã©ãŒãã³ã¹æž¬å®ãšããã«ããã¯åæ
ããã©ãŒãã³ã¹æž¬å®ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æé©åã«ãããŠæåã®äžæ©ã§ããå®è¡æéããªãœãŒã¹äœ¿çšçãèšæž¬ããããšã§ãæãæéããããåŠçããªãœãŒã¹æ¶è²»ãå€ãéšåãç¹å®ã§ããŸãã
OpenCVã¯cv::getTickCountãcv::getTickFrequencyãšãã£ãé¢æ°ãæäŸããŠãããããããçšããããšã§åŠçã®å®è¡æéãæ£ç¢ºã«æž¬å®ããããšãã§ããŸãããããã®ã¡ããªã¯ã¹ãåæããããšã§ãããã«ããã¯ãšãªã£ãŠããéšåãèŠã€ãåºããããã«å¯Ÿããæé©åæŠç¥ãç·Žãããšãå¯èœã«ãªããŸãã
ãããã¡ã€ãªã³ã°ããŒã«ã䜿ã£ãŠãããã«è©³çŽ°ãªããã©ãŒãã³ã¹ããŒã¿ãåéããããšãã§ããŸãããã®ããŒã¿ã¯ã³ãŒãã¬ãã«ã§ã®æé©åæ¡ãæäŸããå®è¡æéã®åæžãç®æãäžã§äžå¯æ¬ ã§ãã
6.4 ãªãœãŒã¹å¶çŽäžã§ã®ç»ååŠçæŠç¥
å šãŠã®ç°å¢ãé«æ§èœãªèšç®ãªãœãŒã¹ãæäŸããããã§ã¯ãããŸãããç¹ã«çµã¿èŸŒã¿ã·ã¹ãã ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããªãœãŒã¹ã®å¶çŽã«é©å¿ããç»ååŠçæŠç¥ãæ±ããããŸãã
ãã®ãããªç¶æ³ã§ã¯ãå¹ççãªã¢ã«ãŽãªãºã ã®éžæãããã«éèŠã«ãªããŸããäœè§£å床ã§ã®åŠçãæ€èšãããç»åã®ååŠçãç°¡ç¥åãããå¿ èŠæå°éã®æ©èœã«çµããªã©ãããŸããŸãªã¢ãããŒãããããŸãã
ãŸããç¹å®ã®ãªãœãŒã¹ãå¶çŽãããŠããç°å¢ã§ã¯ããã®ãªãœãŒã¹ã«å¯Ÿããè² æ ãç¹ã«æèããå¿ èŠããããŸããäŸãã°ãã¡ã¢ãªå®¹éãéãããŠããå Žåãç»åã®å§çž®ãå¹æçãªãã£ãã·ã¥æŠç¥ãæå¹ã«ãªããŸããããã©ãŒãã³ã¹ãç¶æããªãããçŸå®ã®å¶çŽã«å¯Ÿå¿ãããã©ã³ã¹æèŠãäžå¯æ¬ ã§ãã
7. ãŸãšã
OpenCVã¯ã³ã³ãã¥ãŒã¿ããžã§ã³ã®åŒ·åãªãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªã§ãç»åããããªã®åæã«äœ¿ãããŸããåå¿è ã§ãçŽæçã«çšããããšãã§ããWindowsãmacOSãLinuxã§ã®ã€ã³ã¹ããŒã«ãç°¡åã§ããå€èšèªã«å¯Ÿå¿ããç»åã®èªã¿èŸŒã¿ãé¡èªèããªã¢ã«ã¿ã€ã ãã©ããã³ã°ãŸã§å¯Ÿå¿ãããžãã¹ããŒãœã³ãæ°ããªããŒã¿åæãèªååã®ããŒã«ãæ±ããéãOpenCVã¯éåžžã«æå¹ãªéžæè¢ã§ããææ°ã®æè¡ãã¬ã³ããåæ ããæ©æ¢°åŠç¿ããã£ãŒãã©ãŒãã³ã°ãçµ±åãããŠããããã®æé©åãšããã©ãŒãã³ã¹åäžã®ããã®æè¡ãé²åãç¶ããŠããŸãã