Knowhow/Vision

Opencv multi webcam 사용 시 인식 확인

침닦는수건 2022. 6. 13. 14:33
반응형

opencv에서 라이브 웹캠을 2개 이상 사용하고자 할 때, 보통 아래와 같이 접근한다.

import cv2

cam0 = cv2.VideoCapture(0)
cam1 = cv2.VideoCapture(1)
...
camN = cv2.VideoCapture(N) #N is a camera index

이 때, 분명 카메라 N대는 제대로 연결되어 있는데 다음과 같은 오류가 나면서 인식이 안되는 상황이 있을 수 있다.

[ WARN:0@0.132] global /io/opencv/modules/videoio/src/cap_v4l.cpp (889) open VIDEOIO(V4L2:/dev/video1): can't open camera by index

 

이 문제의 원인은 코드에 사용한 camera index와 실제 컴퓨터가 인식하는 camera index가 서로 달라서 발생하는 일이다. 

 

예를 들면, 카메라 2대를 연결했을 때 일반적으로 생각하길 당연히 camera index 0과 1로 인식되었을 것이라 생각하며 0,1을 사용할텐데 실제로 컴퓨터 상에선 0, 4 와 같이 등록되었을 수 있다.

 

이를 어떻게 확인하냐면, 

ls /dev/video* -lh

위 명령어를 통해 현재 컴퓨터에 인식된 카메라의 개수가 몇개인지 확인한 후

 

v4l2-ctl --list-formats-ext -d CAMERA_INDEX # CAMERA_INDEX : 0,1,2,3 ...

위 명령어를 통해서 어떤 camera index 로 컴퓨터에 인식되었는지 확인하면 된다.

 

예를 들면, 현재 내 컴퓨터에는 총 8대의 camera index가 존재하는데

 

하나 하나 확인하다보면 위와 같이 0번 카메라가 좀 다른 것을 알 수 있다. 그림에선 잘랐지만 같은 형태로 4번에도 인식이 되었다.  따라서 현재 내 컴퓨터에 연결된 2대의 카메라는 각각 camera index 0과 4로 인식된 상태. 

 

(2번에도 무언가 표시되는데 이는 각 카메라마다 YUYV, MJPG, H.264 등 pixel format을 달리하여 이미지를 취득할 수 있는데 이 세가지가 쪼개져서 다른 camera index에 연결된 모양이다. H.264 pixel format을 써야한다면 2번을 사용하는게 맞겠다.) 

cam0 = cv2.VideoCapture(0)
cam1 = cv2.VideoCapture(4)

즉, 위와 같이 사용해야 인식이 정상적으로 된다는 뜻이다. 

 

하나 더 살펴보면 문제가 하나 더 있는데, 만약 연결을 끊었다가 다시 할 때, 즉 카메라 연결선을 다른 포트로 바꿔서 꽂을 경우, 이 camera index가 바뀔 수 있다. 

 

이러면 꽂을 때마다 어떤 카메라가 어떤 index인지 찾는 짓거리를 해야하는데 손수하기엔 너무 귀찮다...

 

이 때는 camera device 자체가 들고 있는 정보로부터 찾도록 할 수 있다. 예를 들면 seiral id?

import pyudev

def get_device_info(cam_index = 0):
    context = pyudev.Context()
    device_file = "/dev/video{}".format(cam_index)
    device = pyudev.Devices.from_device_file(context, device_file)
    info = { item[0] : item[1] for item in device.items()}
    return info

위 함수를 써보면 info 안에 각 카메라 별로 정의한 정보들이 들어있는데 그 중에 카메라를 식별할 수 있는 key가 있다면 그걸 이용해서 연결 상태에 따라 매번 변화하는 camera_index에 무관하게 어떤 카메라인지 인식하도록 작성할 수 있다. 

반응형