라즈베리파이에서 opencv로 실시간으로 스트리밍하는 코드에서 자꾸 오류가 나서 검색해봤더니
나오지도않고 많이 애를 먹었는데 생각보다 간단했기에 정리해봤습니다.
이 오류 때문에 단순히 카메라 자원을 쓰는것 자체가 불가능 했었는데요..
오류 문구는 아래와 같습니다. 저와 비슷하게 오류문구가 떴다면 한번 확인해보셨으면 좋겠습니다~~
[ WARN:0] global /home/pi/opencv/modules/videoio/src/cap_gstreamer.cpp (1901) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Cannot identify device '/dev/video-1'. [ WARN:0] global /home/pi/opencv/modules/videoio/src/cap_gstreamer.cpp (990) open OpenCV | GStreamer warning: unable to start pipeline [ WARN:0] global /home/pi/opencv/modules/videoio/src/cap_gstreamer.cpp (577) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created [ WARN:0] global /home/pi/opencv/modules/videoio/src/cap_v4l.cpp (833) createBuffers VIDEOIO(V4L2:/dev/video0): failed mmap(921600): errno=19 (No such device) [ WARN:0] global /home/pi/opencv/modules/videoio/src/cap_v4l.cpp (890) open VIDEOIO(V4L2:/dev/video0): can't open camera by index Traceback (most recent call last): File "/home/pi/ll.py", line 43, in observe() File "/home/pi/ll.py", line 18, in observe cv.imshow("VideoFrame", frame) cv2.error: OpenCV(4.5.1-dev) /home/pi/opencv/modules/highgui/src/window.cpp:404: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'
저의 경우 스트리밍 성능을 비교하기 위해 mjpeg-streamer, uv4l 패키지를 깔았는데요.
결과적으로 uv4l이 백그라운드 프로세스로 계속 열려있었고 카메라 자원을 점유하고 있는데
제가 계속 카메라 자원을 요청하고있었기에 발생한 출동 문제였습니다.
상단 오류 문구의 can't open camera by index가 그 증거이구요.
일단 사전에 카메라가 잘 연결되었는지, 장치가 등록되어있는지 확인해야합니다.
아래 명령어로 확인했을 때 detected, supported가 둘다 1이 떠야합니다.
vcgencmd get_camera
그리고 웹캠은 잘 모르겠으나 rpi cam ( v2모듈 등등)을 사용하고 계시다면 기본적으로
카메라 자원이 0번(video0)으로 등록이 되어있을 텐데 이 부분도 확인해야합니다.
ls /dev/video* 또는 ls /dev/video* -l 명령어로 video0이 뜨는지 확인해야합니다.
안뜬다면 카메라 재연결 + 리부트 해보시길 바랍니다.
이제 다음 단계입니다. 아래 순서대로 한번 확인해보시면 될 것 같네요.
1. 프로세스 확인 ps 명령어 혹은 ps -ef
2. 사용하지 않는 카메라 스트리밍관련 서버 패키지 프로세스 kill
3. 그래도 안되면? 스트리밍 패키지가 데몬으로 부팅시마다 계속 실행 중인지 확인-> 있다면 해제
chkconfig --list 명령어로 확인하면 될 것 같습니다
(이 부분에서 제가 사용하지 않는 uv4l이 데몬으로 돌아가고 있어서 문제가 발생하였습니다.)
4. 확인 차 리부트 + 실행= 완료
**2021-07-06 추가 수정 사항 ***
videocapture함수의 인자를 -1또는 0으로 지정하여 프리뷰 화면을 이용하려 할 때 동시에 스트리밍을 하려고할 때 (mjpg streamer, uv4l, gstreamer등등) 자원선점 오류로 실행에 에러가 발생합니다.
이것은 카메라 자원을 동시에 두 군데에서 요청하기 때문에 발생하는 자연스러운 오류이며 위의 캡처본 같은 오류가 발생할 수 있습니다. 따라서 별도로 스트리밍 서버를 실행시켜놓고 파이썬 코드에서 opencv를 이용한 이미지 처리를 할 때 videocapture()함수 인자에 0또는 -1이 아닌 스트리밍 서버의 주소를 불러와야합니다. 프레임이 끊기는 문제에 대한 해결책은 좀 더 고민한 뒤 업로드 하겠습니다.
AWS 가입은 어렵지 않으므로 스킵하고 오늘은 AWS educate가입 및 EC2를 생성해보겠습니다.
AWS 프리티어 가입과 educate 가입의 차이점으로는 교육자로부터 AWS Educate 가입 초대를 받은 학생에게는 신용 카드 결제 없이 지정된 분량의 AWS 클라우드 리소스에 무료로 액세스할 수 있는 AWS Educate Starter 계정이 제공됩니다. 이 계정은 대부분의 AWS 클라우드 서비스에 대한 액세스를 제공하지만, 종료 후 개인적인 휴대를 허용하지 않습니다.
즉, 교육용으로 가입하게 되면 Free-tier 계정보다 넓은 범위의 서비스 혜택을 누릴 수 있습니다.
가입을 누르고 신분을 정하는데, 저는 학생이기 때문에 학생으로 가입했습니다. 기본적인 인적사항을 적으면 되고 본인의 교육기관리스트가 up되어 있는지 확인합니다. 학생으로 가입하는 분들은 인증을 거쳐야 하기 때문에 반드시 학교 메일로 가입해야합니다.
Submit 버튼을 누르면 아래 두 선택지가 나오게 되는데 기존에 이미 AWS 계정이 있는 분들은 위의 체크박스를 체크하고 AWS 12자리코드를 입력하면됩니다.
코드는 AWS홈페이지-> 내 계정에서 쉽게 확인할 수 있습니다.
AWS에 가입하게되면 비자카드로 1달러를 자동 결제 하는데, 카드 계좌 등의 문제로 계정을 생성하지 못했을 경우 아래 체크박스를 체크하여 진행할 수 있습니다.
여기까지 진행이 완료되면 가입한 메일로 확인 메일이 오게됩니다. 메일 속 링크를 클릭하면됩니다.
그리고 바로 다른 메일이 오는데, 아래 이미지 속 Click here를 클릭하여 새 암호를 설정합니다.
가입을 마치고 aws educate 사이트에 들어가게 되면 아래와 같은 초기화면이 나타납니다.
저는 교수님의 클래스룸 초대 메일을 통해 아래 사진 속에서 My Classrooms 배너가 나타났지만 초기 가입만 마친 상태에서는 뜨지 않는게 정상입니다.
학생으로 가입하신 분들은 아마 교수자나 강의자를 통해 초대 메일을 받게될 텐데, 아래와 같이 메일이 도착합니다.
아래 AWS Educate를 클릭하면 위 초기화면이 나타나고 My Classrooms 배너가 나타난 것을 확인할 수 있습니다.
My classrooms을 클릭하면 본인이 초대된 클래스 그룹(Course Name)이 뜨고 Accept Invitation을 클릭합니다.
다음 화면에 나타나는 파란색 "Go to classrooms" 버튼까지 눌러줍니다.
그럼 다음 화면이 뜨게되고 aws콘솔을 눌러줍니다. (aws 홈페이지에 로그인되어있으면 로그아웃해야합니다.
콘솔창이 뜬다면 정상적으로 접속이 된 것입니다. 상단의 계정명이 굉장히 긴 것을보아 educate 전용 콘솔창임을 알 수 있습니다.
이제 AWS의 서버 EC2를 생성해보도록 하겠습니다.
EC2 의 개념과 기능
EC2는 Elastic Compute Cloud의 약자로, 가상 서버 기능을 제공하는 클라우드 서비스입니다.
AWS의 물리적 서버를 가상화 기술을 이용하여 사용자들이 사용할 수 있고 물리적인 서버없이 클라우드를 통해 필요한 리소스를 요청하여 사용할 수 있습니다.
EC2의 주 기능은 다음과 같습니다.
1. 인스턴스: 가상 컴퓨팅 환경
2. AMI: 서버에 필요한 소프트웨어로 구성된 탬플릿
3. EBS: 가상디스크(하드 디스크에 해당)
4. 인스턴스 스토어 볼륨: 임시 데이터를 저장하는 스토리지 볼륨으로 인스턴스 종료시 삭제됨
명칭과 설명이 바로 와닿진 않지만 앞으로 계속 학습할 예정이므로 다음 그림을 통해 대략적으로나마 이해하고 넘어가도록합니다.
EC2 인스턴스는 가상 컴퓨팅 환경을 의미한다고 했죠? EC2 인스턴스 유형 및 표기법을 간단하게 알고 넘어가겠습니다.
인스턴스는 다음과 같이 표기합니다.
애플리케이션 요구에 따라 인스턴스 패밀리, 세대 및 크기가 결정됩니다.
1. 인스턴스 패밀리: M, T, C, X, R, IO, I, D, G, P, F
2. 인스턴스 세대: 인스턴스 패밀리에 따라 1~5세대
3. 인스턴스 크기: 인스턴스 패밀리 및 세대에 따라 다양한 크기 제공
EC2 인스턴스 스토리지는 크게 인스턴스 스토어, EBS로 구성되어 있는데 인스턴스 스토어는 별도 추가 비용이 필요없는 임시 스토리지고 EBS는 별도의 비용이 발생하는 영구 스토리지입니다.
EC2 인스턴스도 프로세스처럼 수명주기를 가지며 주요 상태는 실행중, 정지됨, 종료됨 상태로 나눌 수 있습니다.
아래그림을 참고하면 좋을 것 같습니다.
간략하게 EC2가 무엇인지 알아보았고 이제 EC2를 직접 생성해보겠습니다.
EC2 생성하기
aws educate 홈페이지에서 아까 접속했던 콘솔창으로 이동합니다.
왼쪽 목롱겡서 인스턴스를 누르면 아래와 같이 화면이 뜹니다. 저는 이미 인스턴스를 하나 만들어놔서 목록이 있지만 처음인 경우 아무것도 나타나지않습니다.
인스턴스를 만들기 위해 오른쪽 상단의 인스턴스 시작 버튼을 눌러줍니다.
1단계로 Amazon Machine Image(AMI)선택 창이 뜨는데 1단계는 운영체제를 선택하는 단계로, 크게 Linux와 Window 중에 선택할 수 있습니다. AMI는 서버에 필요한 운영체제와 여러 소프트웨어들이 적절히 구성된 탬플릿을 의미합니다. 저희는 우분투 18.04LTS버전을 이용하도록합니다.
2단계는 인스턴스 유형 선택 단계로, 인스턴스의 CPU, 메모리, 스토리지, 네트워킹 용량의 여러가지 구성을 필요한 만큼 선택하는 단계를 의미합니다.
프리티어라면 디폴트 상태로 놔두고 넘어갑니다.
3, 4단계도 디폴트 상태를 유지하고 다음을 눌러줍니다.
5단계는 태그 추가로, 어떤 인스턴스를 만들고 어떤 용도, 누가 관리하는 지 등의 설명 기능이라고 볼 수 있는데 저는 키-값을 "Name" -"Server"로 입력했습니다.
6단계는 보안 그룹 생성단계로, 권한과 관련된 것을 지정하는 단계입니다. 네트워크를 통해 누가 인스턴스에 접속 가능한지, 어떤 접속방식을 허용할지 등의 보안설정이 가능합니다. 디폴트는 SSH접속 허용이고 [소스] 에서 내 IP를 클릭 시 해당 웹페이에 접속한 IP가 자동선택됩니다. SSH로 EC2의 우분투에 접근하고 누구나 HTTP프로토콜로 웹서버에 접근할 수 있도록 하기위해 다음과 같이 설정해주고 넘어가도록합니다.
7단계는 본인이 설정한 기능들을 검토하고 문제가 없다면 넘어갑니다. 그럼 이제 다음과 같은 화면이 나타난다.
이 단계는 누군가 본인의 인스턴스에 접근하는 것을 막고 인스턴스에 접근할 때 인증을 받기 위해 사용하는 키를 발급받는 단계입니다.
새 키 페어생성을 누르고 키페어 이름을 설정하고 키 페어 다운로드를 누르면 .pem 파일이 다운되는데, 이 키를 잘 갖고 있어야합니다.
이제 인스턴스 시작을 누르면 다음과 같이 인스턴스가 시작되는것을 확인할 수 있습니다.
다음과 같이 새로 생성한 인스턴스가 잘 실행중임을 확인할 수 있습니다.
이제 ssh원격 연결로 접속해보겠습니다. 원격 접속 툴은 putty가 많이 쓰이나 몇몇 오류가 발생되기도 하여 이번시간에는 tera term을 씁니다.