아키텍처가 다르기 때문인지, pc 개발환경에서 잘 작동하던 코드들이 JetPack에서는 작동하지 않았다.
KFQ 최종 프로젝트에서 사용한 카메라 영상 송수신 모듈을 개발하는 중 발생하였다.
opencv를 사용할 때, 특히 VideoCapture
를 사용함에 있어서 참고하면 될 것 같다.
오류 메세지
1
2
3
import cv2
capture = cv2.VideoCapture(0)
후략..
1
2
3
4
5
6
7
8
9
10
11
$ python cam_server.py
[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (1757) handleMessage OpenCV \
| GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error.
[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (886) open OpenCV \
| GStreamer warning: unable to start pipeline
[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV \
| GStreamer warning: GStreamer: pipeline have not been created
select timeout
VIDIOC_DQBUF: Resource temporarily unavailable
OpenCV(4.1.1) /home/nvidia/host/build_opencv/nv_opencv/modules/imgcodecs/src/grfmt_base.capp:145: error: (-10:Unknown error code -10) \
Raw image encoder error: Empty JPEG image (DNL not supported) in function 'throwOnEror'
원인
파악중
arm64, x86_64, i386 등.. 아키텍처의 차이로 인한 것일까..? 잘 모르겠다..
해결 방법
1
2
3
4
5
6
7
import cv2
capture = cv2.VideoCapture("nvarguscamerasrc sensor-id=0 ! video/x-raw(memory:NVMM),
width=640, height=480, format=(string)NV12,
framerate=(fraction)20/1 ! nvvidconv flip-method=0 ! video/x-raw,
width=640, height=480, format=(string)BGRx ! videoconvert ! video/x-raw,
format=(string)BGR ! appsink", cv2.CAP_GSTREAMER)
후략..
VideoCapture
내부에 위와 같은 코드로 수정을 해주어 해결하였다.
정상적으로 작동하는 모습을 확인하였다.