2013-11-28 2 views
4

/dev 폴더에 비디오 장치의 여지가 (예를 들어 video1, video2, ..., video9)는 항상 유효한 가리키는 하나 /dev/video 장치 (물론, 변경할 수 있습니다). 나는 cv::Videocapture를 사용 OpenCV의와 /dev/video 장치를 열려는 그것을 열 두 가지 방법이 있다는 것을 깨달았다사용하여 장치 이름은

VideoCapture::VideoCapture(const string& filename) 
VideoCapture::VideoCapture(int device) 

첫 번째는 파일을 열고 두 번째는 /dev/video[device]을 엽니 다가.

cap = cv::VideoCapture("/dev/video");과 같은 작업을 수행 할 수있는 방법이 있습니까?

답변

1

은이 같은 새로운 캡처 만들 수 있습니다 3.2.0 :이 방법은 당신이 /dev/v4l/by-id에서 그것을 V4L 장치 경로를 제공하거나, 예를 들어 같은 /dev/v4l/by-path 경우에도 작동

cv::VideoCapture cap("/dev/video20", cv::CAP_V4L); 

을 그 추가 생성자 중 하나를

VideoCapture (const String &filename, int apiPreference)
열기 비디오 파일 또는 캡처 장치 또는 비디오의 IP 비디오 스트림 API 환경 설정으로 캡처.

이 개방 기능도 가능하다 :

cap.open("/dev/video20", cv::CAP_V4L); 

난이 성공적 쿠분투 16.10 하에서 현재 자식 마스터로부터 컴파일 OpenCV의 자체 테스트 하였다.

+0

정말 멋지다! 그래서 업데이트 만하면됩니다. – Tik0

0

OpenCV 2.4.11 (cap.cpp)의 소스 코드를 보면 const 문자열 &을 사용하는 오버로드가 파일을로드 할 때 FFMPEG 또는 GStreamer와 같은 다른 플러그인을 사용하는 'cvCreateFileCapture'를 호출하는 것을 볼 수 있습니다 아니야.

bool VideoCapture::open(const string& filename) 
{ 
    if (isOpened()) release(); 
    cap = cvCreateFileCapture(filename.c_str()); 
    return isOpened(); 
} 
0

가장 좋은 것은 장치의 ID를 구문 분석하는 것입니다.

#include <regex> 
#include <boost/filesystem.hpp> 

... 

boost::filesystem::path path("/dev/video3"); 
auto target = boost::filesystem::canonical(path).string(); 
std::regex exp(".*video(\\d+)"); 
std::smatch match; 
std::regex_search(target, match, exp); 
auto id = strtod(match[1]); 
auto cap = cv::VideoCapture(id); 

주 경로가 절대 수 있도록하고 기호 링크를 해결하기 canonical()의 사용. 현재 OpenCV의와

"/dev/v4l/by-id/usb-046d_0990_1188AD49-video-index0" 
"/dev/v4l/by-path/pci-0000:00:13.2-usb-0:4.4.4:1.0-video-index0" 
관련 문제