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에 무관하게 어떤 카메라인지 인식하도록 작성할 수 있다.
'Knowhow > Vision' 카테고리의 다른 글
Obj file의 manifold/non-manifold 구분 (0) | 2022.06.30 |
---|---|
3D mesh voxelization (0) | 2022.06.17 |
Opencv large FoV image undistortion (0) | 2022.06.16 |
Opencv webcam resolution control (0) | 2022.06.13 |
Opencv 광각 (Large FoV) 카메라 intrinsic calibration (0) | 2021.11.22 |