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;
}