Raspberry Pi를 위해 Eclipse를 사용하여 OpenCV 예제 크로스 컴파일하는 법
라즈베리파이를 위해 이클립스에서 OpenCV 예제 크로스 컴파일을 하는 방법을 소개합니다.
마지막 업데이트 2019. 5. 3
1. 이클립스 설치
IDE로는 Eclipse를 다운로드 받아서 사용했습니다.
https://www.eclipse.org/downloads/packages/
다운로드 받아서 적절한 곳에 압축을 풀어주기만 하면 사용준비가 완료됩니다.
2. Windows toolchain for Raspberry/PI
윈도우가 설치된 PC에서 사용할 크로스 컴파일러를 설치합니다.
2-1. http://gnutoolchains.com/raspberry/ 에서 사용중인 라즈비안 버전에 따라 알맞는 툴체인을 다운로드 받습니다.
여기서는 라즈비안 최신 버전인 stretch를 기준으로 합니다.
첫번째 줄에 있는 raspberry-gcc6.3.0-r4.exe를 다운로드 받습니다.
2-2. 다운로드 받은 파일을 실행하여 설치를 진행합니다.
2-3. 컴퓨터에 있는 헤더파일과 라이브러리 버전이 라즈베리파이에 있는 것이 동일해지도록 동기화를 해줘야 합니다.
라즈베리파이로부터 파일들을 복사해오는 방식으로 진행됩니다.
처음 진행한 이후에도 라즈베리파이에 새로운 라이브러리를 설치했다면 이 작업을 꼭 다시 해줘야 합니다.
C:\SysGCC\raspberry\TOOLS 디렉토리 내에 있는 UpdateSysroot.bat를 실행시킵니다.
Select 버튼을 클릭합니다.
2-4. Setup a new connection을 더블 클릭합니다.
2-5. Host name에 라즈베리파이가 할당받은 아이피 주소를 적고 User name에 pi, Password에 pi의 패스워드를 적습니다.
Connect 버튼을 클릭하면 접속 가능여부를 체크합니다.
2-6. Save 버튼을 클릭합니다.
2-7. 접속에 문제가 없었다면 상단 입력란에 라즈베리파이의 주소가 보입니다. 동기화를 시작하려면 Synchronize 버튼을 클릭합니다.
추가로 가져올 디렉토리가 있다면 파란색으로 표시한 창에 적어줍니다.
2-8. 라즈베리파이로부터 C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot으로 위에서 설정한 5개 폴더의 하위 폴더 및 파일들이 모두 복사되어 집니다
중간에 다음과 같은 에러가 나지만 중단하지 않고 놔두면 계속 진행이 됩니다.
tar: cups/backend/vnc: Cannot open: Permission denied
tar: Exiting with failure status due to previous errors
지정되어 있는 5개의 폴더가 모두 완료되어야 합니다.
실패한 경우 다시 시도해서 완료해야 합니다.
3.이클립스 설정하기
3-1. 메뉴에서 Help > Install New Software 를 선택합니다.
3-2. Work with 콤보박스에서 --All Available Sites--를 선택합니다.
3-3. Mobile and Device Development 하위 항목에 있는 모든 항목을 체크한 후, Next를 클릭하여 설치를 진행합니다.
3-4. 완료 후, 보이는 창에서 설정을 적용하기 위해서 Restart Now 버튼을 클릭합니다.
4. 예제 프로젝트 컴파일
4-1. 메뉴에서 File > New > C++ Project를 선택합니다.
4-2. 프로젝트 목록에서 C++ Managed Build를 선택합니다.
4-3. Project name을 적고 Project type은 Empty Project, Toolchains는 Cross GCC를 선택합니다.
4-4. Next를 클릭합니다.
4-5. Cross compiler prefix에 arm-linux-gnueabihf-를 입력합니다.
Cross compiler path에는 C:\SysGCC\raspberry\bin를 입력합니다.
4-6. 왼쪽에 있는 프로젝트 이름에서 마우스 우클릭하여 메뉴에서 New > Source File을 선택합니다.
Source file에 소스코드 파일 이름을 적어주고 Finish를 클릭합니다.
프로젝트 탐색기에 main.cpp가 추가되었습니다.
4-7. main.cpp 파일에 다음 코드를 붙여넣기하고 Ctrl+S를 입력하여 저장합니다.
#include <opencv2/opencv.hpp> |
4-8. 메뉴에서 Project > Properties를 선택합니다.
왼쪽 메뉴에서 C/C++ Build > Settings를 선택합니다.
4-9. Cross G++ Compiler > Includes에 다음 경로를 추가합니다.
초록색 + 아이콘을 선택하여 추가하면 됩니다.
사용할 헤더파일의 위치입니다.
C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\usr\local\include
C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\usr\include
C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\usr\local\include\opencv4
4-10. Cross G++ Linker > Libraries를 선택합니다.
초록색 + 아이콘을 선택하여 추가하면 됩니다.
사용할 라이브러리의 위치와 사용할 라이브러리 이름을 지정해줍니다.
Libraries에 사용할 라이브러리 이름을 아래 화면처럼 한줄에 하나씩 입력합니다.
Library search path에 해당 라이브러리를 찾을 위치를 다음처럼 입력해줍니다.
C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\usr\local\lib
C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\usr\lib
C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\lib
Libraries에 사용할 라이브러리 이름을 추가합니다. OpenCV를 사용한 코드를 컴파일하기 위해 필요합니다.
여기에서는 최소한의 라이브러리만 추가했습니다.(굵은 글씨)
opencv_gapi
opencv_stitching
opencv_aruco
opencv_bgsegm
opencv_bioinspired
opencv_ccalib
opencv_dnn_objdetect
opencv_dpm
opencv_face
opencv_freetype
opencv_fuzzy
opencv_hfs
opencv_img_hash
opencv_line_descriptor
opencv_quality
opencv_reg
opencv_rgbd
opencv_saliency
opencv_stereo
opencv_structured_light
opencv_phase_unwrapping
opencv_superres
opencv_optflow
opencv_surface_matching
opencv_tracking
opencv_datasets
opencv_text
opencv_dnn
opencv_plot
opencv_videostab
opencv_video
opencv_xfeatures2d
opencv_shape
opencv_ml
opencv_ximgproc
opencv_xobjdetect
opencv_objdetect
opencv_calib3d
opencv_features2d
opencv_highgui
opencv_videoio
opencv_imgcodecs
opencv_flann
opencv_xphoto
opencv_photo
opencv_imgproc
opencv_core
4-11. Apply and Close를 클릭하면 보이는 창에서 Yes를 선택합니다.
문제 없으면 코드에 보이던 에러가 모두 사라집니다.
4-12. 메뉴에서 Project > Build All을 선택합니다.
문제 없다면 다음과 같은 메시지를 볼 수 있습니다.
23:39:20 **** Build of configuration Debug for project HelloWrold **** make all 'Building file: ../main.cpp' 'Invoking: Cross G++ Compiler' arm-linux-gnueabihf-g++ -I"D:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\usr\local\include" -I"D:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\usr\include" -I"D:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\usr\local\include\opencv4" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.o" -o "main.o" "../main.cpp" 'Finished building: ../main.cpp' ' ' 'Building target: HelloWrold' 'Invoking: Cross G++ Linker' arm-linux-gnueabihf-g++ -L"D:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\usr\local\lib" -L"D:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\usr\lib" -L"D:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot\lib" -o "HelloWrold" ./main.o -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core 'Finished building target: HelloWrold' ' ' 23:39:28 Build Finished. 0 errors, 0 warnings. (took 7s.638ms) |
4-13. 실행파일과 이미지 파일을 옮겨주고 실행해봅니다. 실행파일은 다음 위치에 있습니다.
C:\Users\webnautes\eclipse-workspace\HelloWrold\Debug
MobaXterm을 사용하면 드래그앤 드롭으로 라즈베리파이로 파일을 복사할 수 있습니다.
4-14. 실행 퍼미션을 추가 후, 실행합니다.
MobaXterm에서 실행하면 결과를 별도의 창에 보여줍니다.
이후 추가적으로 라즈베리파이에 라이브러리를 설치했다면 UpdateSysroot.bat 를 실행시켜주어야 합니다.
그래야 컴퓨터 쪽으로 해당 라이브러리와 헤더파일을 가져와서 크로스 컴파일러도 동일한 환경에서 컴파일을 진행할 수 있게 됩니다.
5. 참고
http://gnutoolchains.com/raspberry/tutorial/
http://www.gurucoding.com/en/raspberry_pi_eclipse/raspberry_pi_cross_compilation_in_eclipse.php