보드에 2개의 CSI포트가 있음(0번, 1번) CSI 0번 포트에 Pi카메라를 연결 후 부팅하면 디바이스 파일 /dev/video0이 추가됨
주의사항 : 보드 전원이 켜진 상태에서 Pi카메라를 연결 또는 분리하지 마시오. 반드시 리눅스를 정상적으로 종료(shutdown) 후 연결 또는 분리할 것, usb 카메라는 상관없음 Pi Cam 기준 모듈버전 V2부터 가능(V1 버전은 지원안됨) 디바이스 확인 후 카메라 사용 가능 $ ls -l /dev/video0
gstreamer를 이용하여 간단히 동작 확인 $ gst-launch-1.0 nvarguscamerasrc sensor-id=0 ! 'video/x-raw(memory:NVMM),width=3264, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=1280, height=720' ! nvvidconv ! nvegltransform ! nveglglessink -ev
Pi카메라 이용시 nvarguscamerasrc 플러그인 사용할것
Pi카메라가 cam0 포트에 연결된 경우 -> sensor-id=0
Pi카메라가 cam1 포트에 연결된 경우 -> sensor-id=1
Camera : Raspberry Pi camera module v2, IMX219 사용가능
카메라앱 cheese에서 Pi카메라는 지원하지 않음(v4l2 driver가 Pi카메라를 지원하지 않음)
make 전에 스왑 영역의 여유 메모리 늘리기 : freezing 방지 $ sudo fallocate -l 4096M /var/swap_temp $ sudo chmod 600 /var/swap_temp $ sudo mkswap /var/swap_temp $ sudo swapon /var/swap_temp $ free -h -> 확인, 전 : 1.xG, 후 : 5.xG $ make -j2 -> 코어 4개 사용 시 freezing 확률 올라감
인스톨 : 헤더파일과 라이브러리파일을 정해진 시스템 디렉토리에 저장 $ sudo rm -r /usr/include/opencv4/opencv2 -> jetpack에 포함된 opencv버전의 헤더파일을 삭제 $ sudo make install -> 헤더파일과 라이브러리파일을 /usr 아래의 정해진 폴더에 설치 $ sudo ldconfig -> opencv 동적링크라이브러리 파일의(*.so) 설치경로 설정(업데이트)
설치확인
$ opencv_version -> 설치버전 출력
$ pkg-config opencv4 --cflags -> 헤더파일경로 출력
$ pkg-config opencv4 --libs ->라이브러리파일 출력
라이브러리 경로는 어떻게 아는가?
opencv 라이브러리는 동적라이브러리(확장자 so)로 생성된다.
동적 링크 라이브러리(*.so) 경로 검색 순서 1. 대상 코드를 컴파일할 때 지정한 동적 라이브러리 검색 경로(makefile에 지정) 2. 환경 변수 LD_LIBRARY_PATH가 지정한 동적 라이브러리 검색 경로 3. 구성 파일 /etc/ld.so.conf에서 지정한 동적 라이브러리 검색 경로 4. 기본 동적 라이브러리 검색 경로/lib 5. 기본 동적 라이브러리 검색 경로/usr/lib입니다.
<설치과정의 이해>
소스다운로드 -> 빌드 -> 라이브러리파일생성(정적 *.a, 동적 *.so) -> 헤더파일, 라이브러리파일을 시스템 디렉토리로 복사(보통 /usr 아래의 정해진 디렉토리), 동적링크라이브러리인 경우(확장자 so) /etc/ld.so.conf 파일안에 라이브러리 경로 저장 후 업데이트(ldconfig명령어 사용)
프로젝트 빌드시는 시스템 디렉토리 아래에 설치된 헤더파일과 라이브러리 파일을 사용하게 된다.
Pi 카메라는 VideoCapture객체생성시 API를 Gstreamer로 설정하고 Gstreamer 명령어로 열어줘야한다.
3.1 소스파일작성
$ cd ~ -> 사용자홈폴더 이동 $ mkdir HelloCV -> 작업폴더 생성 $ cd HelloCV -> 작업폴더 이동 $ vi main.cpp 또는 Visual Studio에서 편집 -> vi 에디터 또는 비주얼 스튜디오이용해서 소스파일(main.cpp)작성
#include "opencv2/opencv.hpp" #include <iostream> using namespace cv; using namespace std; int main() { VideoCapture cap(0); if (!cap.isOpened()) { cerr << "Camera open failed!" << endl; return -1; } Mat frame; while (true) { cap >> frame; if (frame.empty()){ cerr << << “frame empty!" << endl; break; } imshow("frame", frame); if (waitKey(10) == 27) break; } return 0; }
3.2 Makefile작성
소스파일과 같은 폴더에 Makefile 이름으로 저장해야함(확장자없음),
기본적으로 공백없이 시작, 명령행(아래 Makefile에서 들여쓰기한 곳)은 반드시 Tab키로 시작해야함
$ vi Makefile 또는 Visual Studio에서 편집
CC = g++ # GNU c++ 컴파일러 지정, C소스일때는 gcc, C++소스일때는 g++ 이용 CFLAGS = -g -Wall # 컴파일옵션정의, 디버그모드, 모든경고 메시지 출력 SRCS = main.cpp # 소스파일 지정 PROG = HelloCV # 실행파일명 지정
OPENCV = `pkg-config opencv4 --cflags --libs` # opencv 헤더파일경로, 링크할 라이브러리 파일을 자동으로 찾아줌, ` 는 탭키위에 있는 grave accent 문자임 LIBS = $(OPENCV)
pkg-config : 헤더파일경로(-I), 라이브러리경로(-L),라이브러리파일(-l)을 검색해서 빌드 옵션을 자동으로 입력해준다. 경로나 파일이 많은 경우 프로그래머가 직접 작성하기가 힘든데 이경우 편리함, 이기능은 설치된 라이브러리(여기서는 opencv)에서 지원해줘야함, 이러한 정보를 관리하는 파일은 *.pc 파일이며, 이 파일들은 /usr/lib/pkgconfig, /usr/local/lib/pkgconfig에 저장되어 있음, opencv인 경우 opencv.pc에 저장되어 있음
--cflags : 헤더파일 경로
--libs : 라이브러리 파일
* 표준라이브러리에서 제공하는 헤더파일이나 라이브러리 파일의 경로는 컴파일러에 미리 지정되어 있으므로 별도로 옵션으로 지정할 필요없음( /usr/lib, /usr/include, /usr/local/lib, /usr/local/include 등)
3.3 빌드
make 프로그램 실행하여 빌드수행, Makefile에 기술된대로 빌드실행 여기서는 main.cpp를 빌드하여 같은 폴더에 HelloCV라는 실행파일 생성됨(확장자 없음)
$ make
3.4 실행
먼저 카메라 연결 확인
$ ls -l /dev/video*
실행파일명앞에 ./ 붙여줘야함, 리눅스에서는 현재 작업경로가 PATH 지정이 안되어 있기 때문
$ ./HelloCV
3.5. 실행결과를 PC에서 확인하는 방법
Jetson보드에는 모니터가 없는 상태이고 텍스트 기반의 ssh로 원격접속시 영상출력은 확인이 불가능
Windows에 X server를 설치하고 Linux에서 X client(GUI 프로그램, 여기서는 opencv프로그램)를 실행후 Windows에서 실행결과를 확인한다.
왼쪽그림은 젯슨보드에 모니터를 연결한 경우 응용프로그램에서 리눅스에 포함된 Xserver로 데이터를 보내고 모니터에 출력됨 반면에 오른쪽 그림은 젯슨보드에 모니터가 없고 네트워크로 연결된 모니터 있는 다른 컴퓨터의 Xserver로 데이터를 보내 다른 컴퓨터의 모니터에 출력하게 하는 구성이다.
환경설정 프로그램인 XLaunch에서 no access control 설정후 자동실행(-ac 옵션) -> 모든 접근을 허용하겠다는 의미
환경설정 프로그램인 XLaunch프로그램을 마치면 자동으로 Xming이 실행되니 별도로 실행할 필요없음
방화벽 보안경고 뜨면 접근허용선택할것
Xming을 별도로 실행하면 no access control 설정없이 실행되어 통신에러 발생함 반드시 Xlaunch프로그램으로 옵션설정후 자동실행하기 바람
명령프롬프트에서 실행하는 방법 : PATH환경변수에 C:\Program Files (x86)\Xming 추가 후 명령프롬프트에서 Xming :0 -multiwindow -clipboard -ac 실행
실행후 Xming 아이콘을 선택후 마우스 우측버튼을 누르고 View log 선택하면 new Address 뒤에 ip주소가 로컬PC(사용중인 PC)의 IP주소와 같아야 한다. 네트워크 인터페이스가 여러 개인경우(유선랜, 무선랜, 가상망 등) X클라이언트에서 접근할수 없는 네트워크인터페이스가 선택될 경우 문제가 됨
(3) 리눅스에서 X client 프로그램(xclock, xeyes, gedit 등)을 실행하여 윈도우즈에서 실행결과가 출력되는지 확인
4. pi카메라를 이용한 예제
보드 전원을 끄고 pi카메라를 보드에 연결하시오.
주의사항 : 보드 전원이 켜진 상태에서 pi카메라를 연결 또는 분리하지 마시오. 반드시 리눅스를 정상적으로 종료(sudo shutdown -h now) 후 연결 또는 분리할것, usb 카메라는 상관없음
pi카메라는 리눅스 디바이스 드라이버에서 지원하지 않으므로 gstreamer패키지를 이용하여 카메라를 읽어야함
따라서 위 3절 예제에서 다음처럼 수정해야함
#include "opencv2/opencv.hpp" #include<iostream> using namespace cv; using namespace std; int main() {
설치시 에러발생하면 1. 설치할때 새로 만든 opencv폴더를 삭제후 다시 설치 2. 메모리 부족으로 중단되는 경우 있으니 vscode로 접속하지 말고 터미널로 접속하여 설치할 것 3. 추가한 환경변수 확인할것 echo $PATH, echo $LD_LIBRARY_PATH
첫댓글 cuda 경로 설정하는 법
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
13. Post-installation Actions
find /usr -name *cuda* -> CUDA 경로및 버전확인
export PATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
->11.8대신에 실제로 설치된 버전으로 변경, 64bit OS용임
레포지토리 추가 :
$ sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
해당 부분은 없어도 잘 되니 안되면 건너뛰면 됨.
Pi카메라사용시 카메라오픈이 안될때 해결방법
$ ps -al | grep 실행파일명
gstreamer나 opencv 프로세스를 강제로 종료시킨후에 다시 실행해볼것
설치시 에러발생하면
1. 설치할때 새로 만든 opencv폴더를 삭제후 다시 설치
2. 메모리 부족으로 중단되는 경우 있으니 vscode로 접속하지 말고 터미널로 접속하여 설치할 것
3. 추가한 환경변수 확인할것 echo $PATH, echo $LD_LIBRARY_PATH
Linux ACL
https://www.bangseongbeom.com/linux-acl-guide.html
RTX 4070 SUPER
opencv : 4.5.1 -> 4.9.0
CUDA_ARCH_BIN : 5.3 -> 8.9
ENABLE_NEON : ON -> OFF