라즈베리파이에서 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이 아닌 스트리밍 서버의 주소를 불러와야합니다. 프레임이 끊기는 문제에 대한 해결책은 좀 더 고민한 뒤 업로드 하겠습니다.

 

 

+ Recent posts