![](https://habrastorage.org/webt/hb/xt/po/hbxtpox_r6mswlkshq4w3cpovr4.gif)
ä»æ¥ãRaspberry Piã®OpenCVåŠç¿è åãã®Pythonã®äŸãã€ãŸããã¥ã¢ã«ãã£ã³ããŒStereoPiããŒããå ±æããããšæããŸãã å®æããã³ãŒãïŒããã³Raspbianã€ã¡ãŒãžïŒã䜿çšãããšãåçã®ãã£ããã£ãããã£ããã£ãããããªã®æ·±åºŠãããã®ååŸãŸã§ããã¹ãŠã®æé ãå®è¡ã§ããŸãã
å ¥é
ãããã®äŸã¯ãæ¬çªãœãªã¥ãŒã·ã§ã³ã§ã¯ãªãããããã¯ã«å¿å°ãã浞ãããšãç®çãšããŠããããšãããã«åŒ·èª¿ããå¿ èŠããããŸãã ããªããOpenCVã®äžçŽãŠãŒã¶ãŒã§ãããã©ãºããªãŒãæ±ã£ãŠããå Žåã¯ãé©åãªæäœã®ããã«äžå£ã§ã³ãŒãã£ã³ã°ããããã«ã©ãºããªãŒGPUã䜿çšããããšããå§ãããŸãã èšäºã®æåŸã§ãPythonãœãªã¥ãŒã·ã§ã³ã®ãããã«ããã¯ããšå šäœçãªããã©ãŒãã³ã¹ã«ã€ããŠè©³ãã説æããŸãã
ç§ãã¡ã¯äœã«åãçµãã§ããŸãã
ã¢ã€ã¢ã³ãšããŠãããã«ãã®ãããªã»ããã¢ããããããŸãïŒ
![](https://habrastorage.org/webt/or/pd/9u/orpd9ufeuctr0lbmsk0kfogroao.jpeg)
Raspberry Pi Compute Module 3+ã«æèŒãããStereoPiããŒãã æãç°¡åãª2å°ã®ã«ã¡ã©ã¯ãRaspberry PiããŒãžã§ã³V1ïŒov5647ã»ã³ãµãŒäžïŒã«æ¥ç¶ãããŠããŸãã
ã€ã³ã¹ããŒã«ããããã®ïŒ
- Raspbian StretchïŒã«ãŒãã«4.14.98-v7 +ïŒ
- Python 3.5.3
- OpenCV 3.4.4ïŒããªã³ã³ãã€ã«æžã¿ãPython Wheelsã®ãpipãïŒ
- ãã«ã¡ã©1.13
- StereoVision lib 1.0.3ïŒhttps://github.com/erget/StereoVisionïŒ
ãã¹ãŠã®ãœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«ããã»ã¹ã¯ãã®èšäºã®ç¯å²å€ã§ãããå®æããRaspbianã€ã¡ãŒãžãããŠã³ããŒãããããšããå§ãããŸãïŒèšäºã®æåŸã«ããgithubãžã®ãªã³ã¯ïŒã
ã¹ããã1ïŒåçããã£ããã£ãã
ãããè¡ãã«ã¯ã1_test.pyã¹ã¯ãªããã䜿çšããŸã
ã³ã³ãœãŒã«ãéããããŒã ãã©ã«ããŒãããµã³ãã«ã®ãããã©ã«ããŒã«ç§»åããŸãã
cd stereopi-tutorial
ã¹ã¯ãªãããå®è¡ããŸãã
python 1_test.py
éå§åŸãã¹ãã¬ãªç»åã®ãã¬ãã¥ãŒãç»é¢ã«è¡šç€ºãããŸãã Qãã¿ã³ãæŒããšããã»ã¹ãäžæãããæåŸã«ãã£ããã£ãããç»åãä¿åããã次ã®ã¹ã¯ãªããã®ããããã§æ·±åºŠããããèšå®ããããã«äœ¿çšãããŸãã
ãã®ã¹ã¯ãªããã䜿çšãããšããã¹ãŠã®ããŒããŠã§ã¢ãæ£åžžã«åäœããŠããããšã確èªã§ããã ãã§ãªããå°æ¥ã®äœ¿çšã«åããŠæåã®ç»åãååŸã§ããŸãã
æåã®ã¹ã¯ãªããã¯æ¬¡ã®ããã«ãªããŸãã
ã¹ããã2ïŒãã£ãªãã¬ãŒã·ã§ã³çšã®åçãåéãã
ç空äžã®ç圢ã®éŠ¬ã«ã€ããŠè©±ãå Žåãé«å質ã®æ·±åºŠããããååŸããã«ã¯ã2ã€ã®å®å šã«åäžã®ã«ã¡ã©ãå¿ èŠã§ããã«ã¡ã©ã®åçŽè»žãšå 軞ã¯å®å šã«å¹³è¡ã§ã氎平軞ã¯äžèŽããŠããŸãã ããããçŸå®ã®äžçã§ã¯ããã¹ãŠã®ã«ã¡ã©ã¯ãããã«ç°ãªããå®å šã«é 眮ããããšã¯äžå¯èœã§ãã ãã®ããããœãããŠã§ã¢ãã£ãªãã¬ãŒã·ã§ã³ããªãã¯ãèæ¡ãããŸããã çŸå®äžçã®2å°ã®ã«ã¡ã©ã䜿çšããŠãæ¢ç¥ã®ãªããžã§ã¯ãã®å€æ°ã®åçãæ®åœ±ãïŒãã§ã¹ç€ã®ããåçããããŸãïŒãç¹å¥ãªã¢ã«ãŽãªãºã ããã¹ãŠã®ãäžå®å šãããèšç®ããçæ³ã«è¿ã¥ãããã«åçãä¿®æ£ããããšããŸãã
ãã®ã¹ã¯ãªããã¯äœæ¥ã®æåã®æ®µéãå®è¡ããŸããã€ãŸãããã£ãªãã¬ãŒã·ã§ã³çšã®äžé£ã®åçãäœæããã®ã«åœ¹ç«ã¡ãŸãã
ååçã®åã«ãã¹ã¯ãªããã¯5ç§ã®ã«ãŠã³ãããŠã³ãéå§ããŸãã ä»åã¯ãååãšããŠãããŒããæ°ããäœçœ®ã«ç§»åããäž¡æ¹ã®ã«ã¡ã©ã§ãšããžãã¯ããŒã«ããªãããšã確èªãããã®äœçœ®ãåºå®ããã®ã«ååã§ãïŒåçã«ãã¬ããªãããã«ïŒã ããã©ã«ãã§ã¯ãããããµã€ãºã¯30æã®åçã«èšå®ãããŠããŸãã
æã¡äžãïŒ
python 2_chess_cycle.py
ããã»ã¹ïŒ
ãã®çµæã/ scenesãã©ã«ããŒã«äžé£ã®åçããããŸãã
åçããã¢ã«ã«ããããŸã
3çªç®ã®ã¹ã¯ãªãã3_pairs_cut.pyã¯ãæ®åœ±ããåçããå·Šããšãå³ãã®ç»åã«åãåãã/ pairsãã©ã«ããŒã«ä¿åããŸãã å®éããã®ã¹ã¯ãªãããé€å€ããŠããã®å Žã§åãåããè¡ãããšãã§ããŸãããä»åŸã®å®éšã§ã¯éåžžã«åœ¹ç«ã¡ãŸãã ããšãã°ãããŸããŸãªã·ãªãŒãºã®ã¹ã©ã€ã¹ãä¿åããããã¹ã¯ãªããã䜿çšããŠãããã®ãã¢ãæäœããããä»ã®ã¹ãã¬ãªã«ã¡ã©ã§ãã¢ãšããŠæ®åœ±ããåçãæã®ã²ãã§èŠããããããšãã§ããŸãã
ããã«ãåç»åãã«ããããåã«ãã¹ã¯ãªããã¯ãã®ç»åã衚瀺ããŸããããã«ãããå€ãã®å Žåã次ã®ãã£ãªãã¬ãŒã·ã§ã³æé ã®åã«å€±æããåçã確èªããããããåé€ã§ããŸãã
ã¹ã¯ãªãããå®è¡ããŸãã
python 3_pairs_cut.py
çããããªïŒ
å®æããç»åã«ã¯ãå®éšã«äœ¿çšããåçãšã«ãããã¢ã®ã»ããããããŸãã
æ ¡æ£
ã¹ã¯ãªãã4_calibration.pyã¯ããã¹ãŠã®ãã¢ããã§ã¹ããŒãã§æç»ããåçãä¿®æ£ããããã«å¿ èŠãªä¿®æ£ãèšç®ããŸãã ãã®ã¹ã¯ãªããã¯ããã§ã¹ç€ãèŠã€ãããªãã£ãåçãèªåçã«ç Žæ£ãããããåçã倱æããå Žåã§ãäœæ¥ã¯åæ¢ããŸããã 30çµã®åçããã¹ãŠã¢ããããŒãããããšãèšç®ãéå§ãããŸãã çŽ1ååããããŸãã å®äºåŸãã¹ã¯ãªããã¯ã¹ãã¬ãªãã¢ã®1ã€ãååŸããèšç®ããããã£ãªãã¬ãŒã·ã§ã³ãã©ã¡ãŒã¿ãŒã«åºã¥ããŠãããããä¿®æ£ãããä¿®æ£ãããç»åãç»é¢ã«è¡šç€ºããŸãã ãã®æç¹ã§ããã£ãªãã¬ãŒã·ã§ã³ã®å質ãè©äŸ¡ã§ããŸãã
ã³ãã³ãã§å®è¡ïŒ
python 4_calibration.py
äœæ¥äžã®ãã£ãªãã¬ãŒã·ã§ã³ã¹ã¯ãªããïŒ
ããã¹ãããã®ã»ããã¢ãã
5_dm_tune.pyã¹ã¯ãªããã¯ãæåã®ã¹ã¯ãªããã§æ®åœ±ããåçãšãã£ãªãã¬ãŒã·ã§ã³çµæãèªã¿èŸŒã¿ãŸãã 次ã«ã深床ãããã®èšå®ãå€æŽããŠå€æŽå 容ã確èªã§ããã€ã³ã¿ãŒãã§ã€ã¹ã衚瀺ãããŸãã ãã³ãïŒãã©ã¡ãŒã¿ãŒãèšå®ããåã«ãç°ãªãè·é¢ïŒè¿ãïŒ30ã40ã»ã³ãïŒãå¹³åè·é¢ïŒã¡ãŒãã«ãŸãã¯2ïŒããã³è·é¢ïŒã«ãããªããžã§ã¯ããåæã«æã€ãã¬ãŒã ãååŸããŸãã ããã«ãããè¿ãã®ãªããžã§ã¯ãã¯èµ€ãé ãã®ãªããžã§ã¯ãã¯æ¿ãéã«ãªããã©ã¡ãŒã¿ãŒãéžæã§ããŸãã
ç»åã«ã¯ã深床ãããèšå®ãå«ããã¡ã€ã«ãå«ãŸããŠããŸãã ãèšå®ãèªã¿èŸŒãããã¿ã³ãã¯ãªãã¯ããã ãã§ãã¹ã¯ãªããã«èšå®ãèªã¿èŸŒãããšãã§ããŸãã
以äžãéå§ããŸãã
python 5_dm_tune.py
ã»ããã¢ããããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
ãªã¢ã«ã¿ã€ã 深床ããã
æåŸã®6_dm_video.pyã¹ã¯ãªããã¯ã以åã®ã¹ã¯ãªããã®çµæïŒãã£ãªãã¬ãŒã·ã§ã³ãšæ·±åºŠãããã®èšå®ïŒã䜿çšããŠããããªãã深床ããããæ§ç¯ããŸãã
æã¡äžãïŒ
python 6_dm_video.py
å®éã®çµæïŒ
ç§ãã¡ã®ã¹ã¯ãªãããããªãã®å®éšã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãïŒ
念ã®ããããã¹ãŠã®ã¹ã¯ãªããã«ããŒã¹ãããŒã¯åŠçããããQãã¿ã³ãæŒãããšã§äœæ¥ãäžæã§ããããšãè¿œå ããŸããããšãã°ãCtrl + Cã®ããã«ã倧ãŸãã«ãåæ¢ãããšãPythonãšã«ã¡ã©ã®ããåãã®ããã»ã¹ãäžæããã©ãºããªãŒã®åèµ·åãå¿ èŠã«ãªããŸãã
äžçŽè åã
- ããã»ã¹ã®æåã®ã¹ã¯ãªããã¯ããã¬ãŒã ãã£ããã£éã®å¹³åæéãšãå®äºæã«å¹³åFPSã衚瀺ããŸãã ããã¯ãPythonããŸã ãçªæ¯ãããŠããªãç»åãã©ã¡ãŒã¿ãŒãéžæããããã®ã·ã³ãã«ã§äŸ¿å©ãªããŒã«ã§ãã ããã䜿çšããŠã20 FPSã§1280x480ãéžæããŸããããããªã¯é 延ãªãã§ã¬ã³ããªã³ã°ãããŸãã
- ã¹ãã¬ãªãã¢ã1280x480ã®è§£å床ã§ãã£ããã£ããããã640x240ã«ã¹ã±ãŒãªã³ã°ããããšã«æ°ä»ããããããŸããã
åççãªè³ªåïŒãªãããããã¹ãŠã§ããªãããã«ãµã ãã€ã«ããã£ããã£ãããã®åæžã§PythonãããŒãããªãã®ã§ããïŒ
åçïŒéåžžã«äœã解å床ã§ã®çŽæ¥ãã£ããã£ã§ã¯ãã©ãºããªãŒã³ã¢ã«ãŸã åé¡ããããŸãïŒç»åãå£ããŸãïŒã ãããã£ãŠã解å床ã倧ããããŠããç»åãçž®å°ããŸãã ããã§ã¯ãã¡ãã£ãšããããªãã¯ã䜿çšããŸããç»åã¯pythonã§ã¹ã±ãŒãªã³ã°ãããŸããããGPUã®å©ããåããŠã¹ã±ãŒãªã³ã°ããããããã¢ãŒã ã³ã¢ã«è² è·ãããããŸããã - BGRã§ã¯ãªãBGRA圢åŒã§ãããªããã£ããã£ããã®ã¯ãªãã§ããïŒ
GPUãªãœââãŒã¹ã䜿çšããŠç»åã®ãµã€ãºãçž®å°ããŸãããµã€ãºå€æŽã¢ãžã¥ãŒã«ã®ãã€ãã£ãã¯BGRA圢åŒã§ãã BGRAã®ä»£ããã«BGRã䜿çšããå Žåã2ã€ã®æ¬ ç¹ããããŸãã æåã¯æçµçãªFPSããããããã«äœãïŒãã¹ãã§ã¯20ïŒ ïŒã 2çªç®ã¯ãã³ã³ãœãŒã«ã§ã®ç¶ç¶çãªå€åã§ãããPiCameraAlfaStrippingïŒã¢ã«ãã¡ã¹ããªããã³ã°ã䜿çšããŠéã¢ã«ãã¡åœ¢åŒã«å€æããŸãã åçã®ã¢ã«ãã¡åœ¢åŒãããéãèŠã€ãããããããŸããã ãã®ã°ãŒã°ã«ã¯ããã®ããªãã¯ã説æããPicameraã®ããã¥ã¡ã³ãã»ã¯ã·ã§ã³ã«ã€ãªãããŸããã - PiRGBArrayã¯ã©ãã«ãããŸããïŒ
ããã¯ãã«ã¡ã©ãæäœããããã®ãã€ãã£ãã®Picameraã¯ã©ã¹ã«äŒŒãŠããŸãããããã§ã¯äœ¿çšãããŠããŸããã ãã¹ãã§ã¯ãPiRGBArrayã䜿çšããããããæäœãã®ãnumpyé åã䜿çšããæ¹ãã¯ããã«é«éïŒ1.5åïŒã§ããããšãå€æããŠããŸãã ããã¯ãPiRGBArrayãäžè¯ã§ããããšãæå³ãããã®ã§ã¯ãããŸããããããã¯ãããããç§ãã¡ã®æ²ãã£ãæã§ãã - 深床ããããèšç®ããéã®ããŒã»ã³ãã¯ã©ã®ãããããŒããããŸãã
åçã§çããŸãããïŒ
ããã»ããµã®4ã€ã®ã³ã¢ã®ãã¡ãå®éã«ã¯1ã€ã ããããŒããããŠãããããã¯70ïŒ ã§ãã ããã¯ãGUIã䜿çšããŠäœæ¥ãããŠãŒã¶ãŒã«ç»åãšæ·±åºŠããããåºåããŠãããšããäºå®ã«ããããããã§ãã ããã¯ãããã©ãŒãã³ã¹ã«ååãªããŒãžã³ãããããšãæå³ããŸããOpenMPã䜿çšããOpenCVãšCã®ä»ã®æ©èœã®åŸ®èª¿æŽãããã³GUIãªãã®ãæŠéãã¢ãŒãã¯éåžžã«èå³æ·±ãçµæããããããŸãã - ãããã®èšå®ã§ååŸãããæ倧FPS深床ãããã¯äœã§ããïŒ
ã«ã¡ã©ããæ¯ç§20ãã¬ãŒã ããã£ããã£ãããšããç§ãã¡ãéæããæ倧å€ã¯17 FPSã§ããã ããã¹ãããèšå®ã®é床ãã©ã¡ãŒã¿ãŒã«é¢ããŠæããå¿çæ§ã®é«ãããã®ã¯ãââMinDisparityãšNumOfDisparitiesã§ãã ããã¯ããã¬ãŒã ãæ¯èŒããããã®æ€çŽ¢ãŠã£ã³ããŠã«ãã£ãŠã¢ã«ãŽãªãºã å ã§å®è¡ããããã¹ããããã®æ°ã決å®ãããããè«ççã§ãã 2çªç®ã«åå¿ããã®ã¯preFilterCapã§ãç¹ã«æ·±åºŠãããã®ãæ»ããããã«åœ±é¿ããŸãã - ããã»ããµã®æž©åºŠã¯ã©ãã§ããïŒ
Compute Module 3+ LiteïŒããã»ã¹ã«éã®ããã£ããããä»ããæ°ããã·ãªãŒãºïŒã§ã¯ããããã次ã®çµæã衚瀺ãããŸãã
- GPUã®äœ¿çšæ¹æ³
ãµã³ãã«ïŒ ããã§ã¯WebGLã«ãããŸã ïŒãPython Pi3d ãããã³Processingãããžã§ã¯ãïŒ ã©ãºããªãŒã®äŸ ïŒããããããå°ãªããšãããªã¢ã«ã¿ã€ã ã®ç»åã®æªã¿ãšä¿®æ£ã«äœ¿çšã§ããŸãã
py-videocoreãšåŒã°ããäžæèäžã«ããå¥ã®èå³æ·±ãéçºããããŸãã 圌ãšã®éä¿¡ã§ã圌ã¯StereoBMãå éããããã«ãã®ã³ã¢ãšOpenCVãœãŒããCudaãµããŒãã§äœ¿çšã§ãããšããèããè¡šæããŸããã äžè¬çã«ãæé©åã®ããã«-圌ããèšãããã«ãæã€ããã®ãšããžã
ãæž èŽããããšãããããŸããã ãœãŒã¹ãžã®çŽæããããªã³ã¯ã¯ãã¡ãã§ãã