Copyright (C) 커널연구회 (www.kernel.bz)문서작업: 정재준(rgbi3307 골뱅이 nate.com)문서위치(출처): http://www.kernel.bz/SmartPrince아래 내용은 누구나 사용할 수 있습니다.단, 저자정보는 지우지 말고 공유하시고 출처를 기입해 주시기 바랍니다. 똑똑한왕자 Stereo Camera는 컴퓨터 비젼 영상처리 알고리즘을 구현하고자 하는 SW엔지니어들을 위해서 커널연구회에서 개발한 보드입니다. 사람의 시각에 해당하는 데이터 처리를 임베디드 환경에서 구현할 수 있도록 라즈베리파이 호환 카메라 2개를 2개조로 동시처리 가능하며 다음과 같은 기능을 가지고 있습니다. 라즈베리파이 호환 카메라 4개 연결 Stereo Camera 2개조 구성가능, Depth Camera 구현 라즈베리파이3 산업용 컴퓨팅 모듈 2개 동시 연결 HDMI 화면 출력 마이크로 USB 허브에 키보드, 마우스, Eternet, WiFi 연결 가능 OpenCV 및 Python 개발환경(스테레오 카메라 소스 제공) C/C++ 통합개발환경(CodeBlocks), 영상처리 소스 제공 제품은 아래 링크에서 구매 가능합니다.제품구매 링크: https://www.kernel.bz/product/StereoCamera 똑똑한왕자 Stereo Camera 구성요소 라즈베리파이에서 산업용으로 출시한 컴퓨팅 모듈 2개를 동시에 처리할 수 있으며, 매우 안정적으로 동작하며 라즈베리파이3와 완벽하게 호환됩니다. 리눅스 커널은 longterm 안정화 버전인 v4.14가 포팅 되었으며, 영상처리 알고리즘을 개발할 수 있는 환경인 Stereo Camera 디바이스드라이버, OpenCV, Python, C/C++ CodeBlocks, 각종 라이브러리를 SD카드에 설치하여 소스와 함께 제공합니다. 라즈베리파이3 컴퓨팅 모듈 2개와 마이크로 SD카드 2개는 기본적인 제품구성으로 포함되어 있습니다. 마이크로 SD카드 장착 (후면 하단부) 5V 전원 어댑터도 기본적인 제품구성에 포함되어 있으며, 다음과 같이 연결합니다. HDMI 화면은 첫번째 컴퓨팅 모듈에서 출력됩니다. 5V전원 및 HDMI 연결 카메라는 라즈베리파이 호환 v1.0 혹은 v2.0 모두 사용가능하며 별도 선택사양 부품입니다. 라즈베리파이 호환 카메라 4개 연결 USB 허브 및 네트워크 연결을 위한 부품은 별도 선택사양 부품입니다. USB 허브 및 네트워크 연결 (WIFI동글, 키보드, 마우스) 네트워크 연결없이 로컬에서 HDMI 연결하여 바로 작업해도 되지만, USB 허브에 유선 인터넷 케이블이나 USB 와이파이 동글을 장착하면 네트워크 원격 데스크탑으로 다음과 같이 연동할 수 있습니다. 먼저 첫번째 컴퓨팅 모듈1의 HDMI 화면에서 라즈베리파이 리눅스 바탕하면에 포팅되어 있는 원격연결 프로그램인 Remmina 을 실행합니다. 컴퓨팅 모듈1에서 컴퓨팅모듈2 원격 데스크탑 접속 Remmina 프로그램이 실행되면 다음과 같이 두번째 컴퓨팅 모듈2의 IP(192.168.100.12)을 입력하고 Connect 버턴을 클릭 합니다. 첫번째 컴퓨팅 모듈1의 아이피는 192.168.100.11로 설정되어 있고, 두번째 컴퓨팅 모듈2의 아이피는 192.168.100.12으로 설정되어 있습니다. 연결이 되면 다음과 같이 사용자 아이디인 pi와 암호 kernel.bz을 입력합니다. 위의 작업이 마무리되면 다음과 같이 두번째 컴퓨팅 모듈2의 원격 데스크탑 화면이 나타납니다. 컴퓨팅 모듈1에서 컴퓨팅 모듈2의 라즈베리파이 리눅스 GUI 작업을 그대로 실행할 수 있습니다. 두번째 컴퓨팅모듈2의 USB허브에 연결된 무선 WiFi 동글을 통하여 원격지 PC나 노트북에서 무선으로 원격 접속할 수도 있습니다. 접속 방법은 위와 동일합니다만 좀더 자세한 방법은 아래 블로그 링크를 참조해 주시기 바랍니다. 무선 WiFi 원격 데스크탑 접속 방법: https://www.kernel.bz/blogPost/SmartHomeM_Remote 제품은 아래 링크에서 구매 가능합니다.제품구매 링크: https://www.kernel.bz/product/StereoCamera 소프트웨어 SDK 소프트웨어는 OpenCV, Python, C/C++ CodeBlocks 개발환경이 설치되어 있고 관련 소스도 제공합니다.먼저 OpenCV 라이브러리는 다음과 같이 설치되어 있으며 소스는 SD카드의 /home/pi/projects/opencv3 경로에 있습니다. OpenCV 라이브러리 설치정보 pi@SmartPrinceM01:~/projects$ pkg-config --libs opencv -L/usr/local/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core pi@SmartPrinceM01:~/projects$ ls /usr/local/lib/ libopencv_highgui.so libopencv_photo.so.4.1.2 libopencv_calib3d.so libopencv_highgui.so.3.4 libopencv_shape.so libopencv_calib3d.so.3.4 libopencv_highgui.so.3.4.0 libopencv_shape.so.3.4 libopencv_calib3d.so.3.4.0 libopencv_highgui.so.4.1 libopencv_shape.so.3.4.0 libopencv_calib3d.so.4.1 libopencv_highgui.so.4.1.2 libopencv_stitching.so libopencv_calib3d.so.4.1.2 libopencv_imgcodecs.so libopencv_stitching.so.3.4 libopencv_core.so libopencv_imgcodecs.so.3.4 libopencv_stitching.so.3.4.0 libopencv_core.so.3.4 libopencv_imgcodecs.so.3.4.0 libopencv_stitching.so.4.1 libopencv_core.so.3.4.0 libopencv_imgcodecs.so.4.1 libopencv_stitching.so.4.1.2 libopencv_core.so.4.1 libopencv_imgcodecs.so.4.1.2 libopencv_superres.so libopencv_core.so.4.1.2 libopencv_imgproc.so libopencv_superres.so.3.4 libopencv_dnn.so libopencv_imgproc.so.3.4 libopencv_superres.so.3.4.0 libopencv_dnn.so.3.4 libopencv_imgproc.so.3.4.0 libopencv_videoio.so libopencv_dnn.so.3.4.0 libopencv_imgproc.so.4.1 libopencv_videoio.so.3.4 libopencv_dnn.so.4.1 libopencv_imgproc.so.4.1.2 libopencv_videoio.so.3.4.0 libopencv_dnn.so.4.1.2 libopencv_ml.so libopencv_videoio.so.4.1 libopencv_features2d.so libopencv_ml.so.3.4 libopencv_videoio.so.4.1.2 libopencv_features2d.so.3.4 libopencv_ml.so.3.4.0 libopencv_video.so libopencv_features2d.so.3.4.0 libopencv_ml.so.4.1 libopencv_video.so.3.4 libopencv_features2d.so.4.1 libopencv_ml.so.4.1.2 libopencv_video.so.3.4.0 libopencv_features2d.so.4.1.2 libopencv_objdetect.so libopencv_video.so.4.1 libopencv_flann.so libopencv_objdetect.so.3.4 libopencv_video.so.4.1.2 libopencv_flann.so.3.4 libopencv_objdetect.so.3.4.0 libopencv_videostab.so libopencv_flann.so.3.4.0 libopencv_objdetect.so.4.1 libopencv_videostab.so.3.4 libopencv_flann.so.4.1 libopencv_objdetect.so.4.1.2 libopencv_videostab.so.3.4.0 libopencv_flann.so.4.1.2 libopencv_photo.so pkgconfig libopencv_gapi.so libopencv_photo.so.3.4 pypy2.7 libopencv_gapi.so.4.1 libopencv_photo.so.3.4.0 python2.7 libopencv_gapi.so.4.1.2 libopencv_photo.so.4.1 python3.5 파이썬 소스는 SD카드의 /home/pi/projects/stereopi/ 경로에 다음과 같이 제공됩니다. 파이썬 Stereo Camera 소스 pi@SmartPrinceM01:~/projects/stereopi$ lltotal 7592drwxr-xr-x 5 pi pi 4096 Dec 26 17:56 .drwxr-xr-x 8 pi pi 4096 Dec 26 13:13 ..-rw-r--r-- 1 pi pi 2895 Sep 11 02:44 1_test.py-rw-r--r-- 1 pi pi 3457 Sep 11 02:45 2_chess_cycle.py-rw-r--r-- 1 pi pi 224 Sep 12 00:00 3dmap_set.txt-rw-r--r-- 1 pi pi 2274 Sep 11 02:48 3_pairs_cut.py-rw-r--r-- 1 pi pi 16694 Sep 11 07:03 4_calibration_fisheye.py-rw-r--r-- 1 pi pi 9291 Sep 12 00:11 5_dm_tune.py-rw-r--r-- 1 pi pi 5459 Jul 29 23:03 6_dm_video.py-rw-r--r-- 1 pi pi 7959 Dec 25 16:04 7_2d_map.py-rw-r--r-- 1 pi pi 2624 Sep 12 03:23 buster-opencv-notice.mddrwxr-xr-x 4 pi pi 4096 Oct 30 09:57 calibration_data-rw-r--r-- 1 pi pi 35129 Jul 30 09:01 LICENSE-rw-r--r-- 1 pi pi 4751147 Apr 3 2019 normal.jpgdrwxr-xr-x 2 pi pi 4096 Oct 30 09:57 pairs-rw-r--r-- 1 pi pi 22255 Mar 28 2019 pattern.png-rw-r--r-- 1 pi pi 1080 Jul 30 08:56 README.md 위의 소스들 중에서 python3 1_test.py 을 실행하면 다음과 같이 왼쪽과 오른쪽 카메라 영상이 동시에 출력됩니다. 1_test.py 실행 화면 python3 7_2d_map.py 을 실행하면 다음과 같이 왼쪽, 오른쪽 카메라 영상을 분석한 정보가 출력됩니다. 7_2d_map.py 실행 화면 C/C++ CodeBlocks 소스는 SD카드의 /home/pi/projects/motion/cview 경로에 다음과 같이 있습니다. cview 소스는 C언어로 되어 있으며 motion 오픈소스를 활용하여 커널연구회에서 영상 캡쳐 및 분석용 소스로 코딩한 것입니다. C/C++ CodeBlocks 소스(cview) pi@SmartPrinceM01:~/projects/motion$ ll cviewtotal 204drwxr-xr-x 2 pi pi 4096 Dec 26 16:04 .drwxr-xr-x 7 pi pi 4096 Dec 26 15:29 ..-rw-r--r-- 1 pi pi 1179 Dec 20 13:01 alg.h-rw-r--r-- 1 pi pi 3022 Sep 20 2017 conf.h-rw-r--r-- 1 pi pi 3208 Sep 20 2017 debug.c-rw-r--r-- 1 pi pi 1481 Nov 7 16:30 debug.h-rw-r--r-- 1 pi pi 6674 Dec 26 11:43 image.c-rw-r--r-- 1 pi pi 827 Dec 26 11:43 image.h-rw-r--r-- 1 pi pi 40923 Dec 26 12:11 jpegutils.c-rw-r--r-- 1 pi pi 2780 Sep 25 2017 jpegutils.h-rw-r--r-- 1 pi pi 1166 Dec 26 16:04 main.c-rw-r--r-- 1 pi pi 1211 Dec 26 12:13 memory.h-rw-r--r-- 1 pi pi 6376 Dec 26 15:56 motion.c-rw-r--r-- 1 pi pi 12115 Dec 26 12:02 motion.h-rw-r--r-- 1 pi pi 579 Dec 12 16:56 netcam.h-rw-r--r-- 1 pi pi 4115 Dec 26 15:16 opencv.c-rw-r--r-- 1 pi pi 521 Dec 26 15:17 opencv.h-rw-r--r-- 1 pi pi 15007 Dec 26 12:14 rotate.c-rw-r--r-- 1 pi pi 1635 Jun 1 2010 rotate.h-rw-r--r-- 1 pi pi 30842 Dec 26 12:16 video.c-rw-r--r-- 1 pi pi 18223 Dec 26 12:17 video_conv.c-rw-r--r-- 1 pi pi 1590 Dec 12 16:56 video_conv.h-rw-r--r-- 1 pi pi 2111 Dec 25 15:14 video.h /home/pi/projects/motion/bin 경로에 있는 cview을 다음과 같이 실행합니다.cd /home/pi/projects/motion/bin ./cview 0 옵션으로 실행하면 "/dev/video0" 카메라의 영상을 캡쳐하여 화면에 출력합니다../cview 1 옵션으로 실행하면 "/dev/video1" 카메라의 영상을 캡쳐하여 화면에 출력합니다. ./cview 0 1 옵션으로 실행하면 "/dev/video0" 카메라의 영상을 흑백으로 캡쳐하여 화면에 출력합니다../cview 0 3 옵션으로 실행하면 "/dev/video0" 카메라의 영상을 컬러로 캡쳐하여 화면에 출력합니다../cview 1 3 800 600 옵션으로 실행하면 "/dev/video1" 카메라의 영상을 컬러로 800x600 픽셀로 캡쳐하여 화면에 출력합니다. cview 실행 화면 참고로 /home/pi/projects/motion/src에 있는 소스들은 motion 오픈소스입니다. motion은 카메라 영상의 변화를 동영상으로 캡쳐할 수 있고, 웹으로 스트리밍도 가능합니다. motion 영상 캡쳐 화면 motion에 대한 자세한 정보는 아래 웹사이트 링크에서 확인 가능합니다.https://motion-project.github.io/index.html Depth 데이터 수집 기능Stereo Depth 데이터는 다음과 같이 왼쪽과 오른쪽 카메라 영상을 분석하여 사물의 거리에 따른 원근감(Depth)을 산출합니다. 사물이 멀리 있으면 Depth는 어둡게 나타나고 가깝게 있을수록 밝게 나타납니다.이 기능은 커널연구회에서 C언어로 직접 알고리즘 코딩한 것입니다. 제품을 구매하시면 소스를 제공해 드립니다. Stereo Depth 데이터Depth 데이터는 사물이 가깝게 있으면 밝게 멀리 있으면 어둡게 나타납니다. 제품은 아래 링크에서 구매 가능합니다.제품구매 링크: https://www.kernel.bz/product/StereoCamera 입출력 인터페이스 핀맵 구성 보드 상단에 있는 헤더핀들은 핀의 길이가 long형태로 되어 있어 세로방향으로 적층할 수 있도록 구성했습니다. 핀번호 배열은 다음과 같이 아두이노와 호환 됩니다. I2C 인터페이스(PE9, PE10)는 컴퓨팅모듈1과 모듈2로 함께 연결되어 있습니다. Serial 인터페이스는 2개가 있습니다. PD1과 PD2번핀은 컴퓨팅모듈1과 시리얼로 연결되고, PD3과 PD4번핀은 컴퓨팅모듈2와 시리얼로 연결됩니다. SPI 인터페이스(PE4, PE5, PE6)는 컴퓨팅모듈1과 연결되어 있습니다. 인터럽트 인터페이스(PE1, PA5)핀은 컴퓨팅모듈1과 연결되어 있습니다. 그리고 PB6번핀은 보드 전체로 공급되는 전원을 on/off할수 있는 GPIO핀으로 사용합니다. 상단 헤더핀 맵 (아두이노 호환) 아래는 컴퓨팅 모듈1의 핀맵 구성입니다. Serial 인터페이스핀(GPIO40, 41)과 I2C 인터페이스핀(GPIO2, 3)과 SPI 인터페이스핀(GPIO18, 19, 20, 21)은 컴퓨팅 모듈2와 서로 연결됩니다. Serial 인터페이스핀(GPIO14, 15)과 SPI 인터페이스핀(GPIO9, 10, 11)과 인터럽트 인터페이스핀(GPIO25, 26)은 보드 상단의 헤더핀을 통하여 외부로 연결됩니다. 특별히 GPIO34번핀은 컴퓨팅 모듈2의 전원을 on/off할수 있는 GPIO로 사용합니다. 컴퓨팅 모듈1 핀맵 구성 아래는 컴퓨팅 모듈2의 핀맵 구성입니다. Serial 인터페이스핀(GPIO40, 41)과 I2C 인터페이스핀(GPIO2, 3)과 SPI 인터페이스핀(GPIO18, 19, 20, 21)은 컴퓨팅 모듈1와 서로 연결됩니다. Serial 인터페이스핀(GPIO14, 15)는 보드 상단의 헤더핀을 통하여 외부로 연결됩니다. 컴퓨팅 모듈2 핀맵 구성 전원제어 기능특별히, 컴퓨팅 모듈1에서 컴퓨팅 모듈2의 전원을 on/off할 수 있는 기능이 있습니다. 컴퓨팅 모듈1에 있는 GPIO34을 통하여 제어할 수 있습니다. SD카드의 /home/pi/projects/tools/ 경로를 보면 cm2-switch 라는 파일이 있습니다. 이 파일을 다음과 같이 실행합니다. cd /home/pi/projects/tools./cm2-switch 0 옵션으로 실행하면 컴퓨팅 모듈2의 전원이 off 됩니다../cm2-switch 1 옵션으로 실행하면 컴퓨팅 모듈2의 전원이 on 됩니다. 컴퓨팅 모듈2 전원 on/off 제품은 아래 링크에서 구매 가능합니다. 제품구매 링크: https://www.kernel.bz/product/StereoCamera 사용예(동영상 시연): https://www.kernel.bz/blogPost/spsc-video 감사합니다. 궁금한 사항은 댓글 부탁드립니다.