CSI 카메라는 그냥 웹캠과는 조금 다르게 접근해야 합니다.
opencv를 처음 접하실 때 CSI카메라를 사용하는 경우는 대개 MIPI-CSI 커넥터가 있는 Jetson 시리즈 혹은 라즈베리파이와 같은 SBC(Single Board Computer)를 통해 접근하는 경우가 대부분일 것입니다. 그리고 이렇게 접근하시는 분들 중에 CSI가 왜 안돼지? 라고 의문을 품는 경우가 많을텐데요.
import cv2 #OpenCV를 사용하기위해 import해줍니다.
def main():
camera = cv2.VideoCapture(-1) #카메라를 비디오 입력으로 사용. -1은 기본설정이라는 뜻
camera.set(3,640) #띄울 동영상의 가로사이즈 640픽셀
camera.set(4,480) #세로사이즈 480픽셀
while( camera.isOpened() ): #카메라가 Open되어 있다면,
_, image = camera.read() ##비디오의 한 프레임씩 읽습니다. _값이 True, 실패하면 False, image에 읽은 프레임이 나옴
image = cv2.flip(image,-1) #카메라 이미지를 flip, 뒤집습니다. -1은 180도 뒤집는다는 뜻입니다.
cv2.imshow( 'camera test' , image) #카메라를 'camera test'라는 이름의 파일로 보여줍니다.
if cv2.waitKey(1) == ord('q'): #만약 q라는 키보드값을 읽으면 종료합니다.
break
cv2.destroyAllWindows() #이후 openCV창을 종료합니다.
if __name__ == '__main__':
main()
코딩하는 너굴맨님의 포스트( https://chick-it.tistory.com/19 ) 와 같이 사용해서 이슈가 없길 바라지만, 아마 이 글을 보시는 분들은 이런 방법으로 안되서 이 글을 읽고 계실 겁니다. 근데 이런 방법으로 안되서 연결 테스트를 해보고, 라즈베리파이/ 젯슨 나노에 있는 기본 앱 혹은 명령으로 카메라를 실행시켜보면 또 되는 상황이 벌어지는 것을 경험할 수 있습니다. 예를 들어, 젯슨 나노의 경우 다음의 명령어를 사용하면 되지만,
gst-launch-1.0 nvarguscamerasrc ! nvoverlaysink # 작동함
opencv-python에서 해보면 또 안되는 경험을 할 수 있습니다.
import cv2
cap = cv2.VideoCapture('nvarguscamerasrc ! nvoverlaysink') # 작동안함
문제 확인
근본적인 해결책은 지금 설치된 opencv-python에 gstreamer가 빌드되었는지 확인하는 겁니다. 이 내용은 이전에 작성한(https://whiteknight3672.tistory.com/342) 에 있는 내용이지만, 이러한 주제를 좀 더 깊게 다루기 위해 별도의 포스팅으로 다룹니다.
이 경우, opencv-python 에 gstreamer가 컴파일 되지 않았을 것입니다. 다음의 명령어를 통해 gstreamer가 컴파일 되었는지 확인하세요.
import cv2
print(cv2.getBuildInformation())
이 때, 다음과 같이 뜬다면 OpenCV를 별도로 컴파일 하면서 gstreamer를 포함해야 합니다.
GStreamer: NO
libv4l/libv4l2: NO
v4l/v4l2: linux/videodev2.h
OpenCV에 gstreamer를 포함하여 빌드하는 방법에 대해서는 다음을 참조하시면 되며, 빌드 과정에서 사용할 쉘 스크립트 파일에 -WITH-GSTREAMER 옵션이 포함되어 있다면 정상적으로 활용할 수 있습니다.
GitHub - Qengineering/Install-OpenCV-Jetson-Nano: OpenCV installation script with CUDA and cuDNN support
OpenCV installation script with CUDA and cuDNN support - GitHub - Qengineering/Install-OpenCV-Jetson-Nano: OpenCV installation script with CUDA and cuDNN support
github.com
직접 빌드를 진행한 이후 cv2.getBuildInformation() 를 해 보시면 GStreamer 부분이 YES로 표현된 것을 확인할 수 있습니다.
왜 GStreamer가 빠진 opencv가 배포되는가?
그렇다면 GStreamer가 컴파일 된 opencv-python이 PyPI 에 배포되어서 우리같은 유저들이 손쉽게 실행할 수 있도록 하면 되지 않을까요? 아쉽게도 그렇지는 않습니다. 이러한 이유에 대해 정확히 알 수는 없으나, GStreamer 내부 플러그인 중에는 저작권이 있는(non-free) 플러그인이 있어서 opencv-python 이 빌드될 때 gstreamer가 포함되지 않는 것으로 추정됩니다.
Done!
MIPI-CSI와 DSI, HDMI, DP 등의 포트 규격은 그 근본은 이미지 패킷을 얼마나 고속으로 전달할 수 있느냐의 문제입니다. USB 웹캠이 아닌 CSI 포트가 굳이 있는 이유는, 라즈베리파이와 같은 저가, 저성능의 보드에서 상대적으로 저렴하게, CPU 부담 없이 카메라를 사용하기 위함힙니다. 이러한 내용 혹은 통신에 관한 간단한 역사를 조금 다뤄볼까 하는데, 조회수가 들인 시간 대비 나오지 않을 것 같아 주저하고 있습니다.
시간이 지날수록 조회수만 끌려는 글을 쓰려 해서 큰일입니다. 퀄리티와 트래픽은 전혀 다른 개념이고, 저는 이 블로그에서 어떤 것을 추구할지 아직 방향을 못잡고 있는 상태입니다. 운영한지 10년이 넘어가는 지금에서도요. 트래픽을 유튜브를 통해 잡고 퀄리티를 블로그를 통해 얻을 것인가? 늘 고민입니다.
긴 글 읽어주셔서 감사합니다. ❤️와 광고 클릭으로 고마움을 간단히 표현할 수 있습니다.
개발 환경(Desktop) | Ryzen 5900X, RTX3080
개발 환경(Laptop) | M2 Macbook Pro
AI, IoT 제품 개발 및 기타 문의 | dokixote@wklabs.io