콘텐츠로 건너뛰기

wsl에서 웹캠 장치 등록하기

1. 랩톱의 wsl에 카메라를 인식시키기

PS C:\Users\User> usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-1    062a:4101  USB 입력 장치                                                 Not shared
2-4    0408:2098  USB webcam, Camera DFU Device                                 Shared
2-10   8087:0026  인텔(R) 무선 Bluetooth(R)                                     Not shared

Persisted:
GUID                                  DEVICE

PS C:\Users\User>

위와 같다면, 아직 wsl에서 이 웹캠장치에 연결이 불가능하다.

2. 윈도우 PowerShell에서 카메라 연결 (순서대로 입력)

Windows PowerShell을 관리자 권한으로 실행한 후 다음 명령어들을 입력한다.

PS C:\Users\User> winget install usbipd-win
; windows 패키지 관리자로 프로그램 다운로드한다.
; 인스톨을 했다면 윗 명령줄은 불필요하다.

PS C:\Users\User> usbipd list ; usb에 연결된 장치 리스트를 불러온다.
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-1    062a:4101  USB 입력 장치                                                 Not shared
2-4    0408:2098  USB webcam, Camera DFU Device                                 Shared
2-10   8087:0026  인텔(R) 무선 Bluetooth(R)                                     Not shared
; Busid 2-4가 웹캠아이디

PS C:\Users\User> usbipd attach --wsl --busid 2-4 ;2-4 장치를 연결한다.
usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Loading vhci_hcd module.
usbipd: info: Detected networking mode 'nat'.
usbipd: info: Using IP address 172.18.144.1 to reach the host.
PS C:\Users\User>

PS C:\Users\User> usbipd list ; 설치가 정상적으로 완료되었음을 확인해보자.
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-1    062a:4101  USB 입력 장치                                                 Not shared
2-4    0408:2098  USB webcam, Camera DFU Device                                 Attached
2-10   8087:0026  인텔(R) 무선 Bluetooth(R)                                     Not shared

Persisted:
GUID                                  DEVICE

PS C:\Users\User>
PS C:\Users\User> wsl ; wsl실행
robot@kimsh:/mnt/c/Users/User$ ls -l /dev/video*
crw-rw---- 1 root video 81, 0 Dec 22 08:05 /dev/video0
crw-rw---- 1 root video 81, 1 Dec 22 08:05 /dev/video1
; video0으로 마운트되었다.

2. 코드: 영상 화면

카메라를 열고 가로, 세로 사이즈를 출력하고 카메라가 잘 작동하는지 눈으로 확인하기 위해 영상을 화면에 띄우는 코드를 실행한다.

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {  
    cv::VideoCapture capture(0, cv::CAP_V4L2);
    if(!capture.isOpened()) {
        std::cerr << "카메라를 열 수 없습니다." << std::endl;
        return -1;
    }

    // WSL2 등에서 타임아웃 방지를 위해 MJPG 포맷으로 설정
    capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));

    std::cout << "Web CAM Height: " << cvRound(capture.get(cv::CAP_PROP_FRAME_HEIGHT)) << std::endl;
    std::cout << "Web CAM Width: " << cvRound(capture.get(cv::CAP_PROP_FRAME_WIDTH)) << std::endl;


    cv::Mat frame, inversed;
    while(true) {
        capture >> frame;
        if(frame.empty()) break;

        cv::imshow("Video", frame);
        if(cv::waitKey(10) == 27) break;
    }
    cv::destroyAllWindows();
    cv::waitKey(1); // 윈도우 종료 이벤트를 처리하기 위해 잠시 대기

    return 0;
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다