VideoCapture의 색인과 비슷한 문제가있었습니다. 4 개의 USB 웹캠이 있는데 어느 웹캠이 어떤 색인에 해당하는지 알아야합니다. OpenCV는 카메라 식별을 지원하기 위해 솔기를 맺지 않습니다. 나는 Mac OS 10.8을 사용하고 있으므로 Ubuntu에 대한 해결책을 제공하지는 않지만 어쨌든 내 솔루션은 어디서 볼 것인지 힌트를 줄 수 있습니다. opencv가 카메라 정보를 검색하고 Mac OS 프레임 워크 (AVFoundation)를 발견 한 OpenCV 소스를 조사했습니다. 이 프레임 워크를 사용하여 웹캠과 하드웨어 ID의 순서를 얻을 수있었습니다. 이 순서는 VideoCapture 클래스에 대한 카메라 인덱스에 대응하여 인덱스 변경을 만든다. 다시 부팅 한 후에 더 이상 문제가 없습니다.
편집 : MacOS 용 솔루션 : 자바로 작업하고 있기 때문에 jna 또는 jni로 래퍼를 작성하고 싶지 않으므로 간단한 objective-c 명령 줄 도구를 작성하여 콘솔 카메라. 그 다음에 나는 Runtime.getRuntime(). exec()을 통해 명령 행 도구를 실행한다.
오브젝티브 -C 명령 행 도구 main.m
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
int main() {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
AVCaptureDevice *device;
NSArray* devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (int i=0; i<[devices count]; i++) {
device = [devices objectAtIndex:i];
NSString *devUid = [device uniqueID];
NSString *devName = [device localizedName];
printf("%s\n", [devUid cStringUsingEncoding:NSUTF8StringEncoding]);
}
[pool release];
return 1;
}
리눅스에 대한 대체 솔루션이를 사용하는 수 있습니다 자바
ArrayList<String> cameras = new ArrayList<String>();
try {
String line;
Process process = Runtime.getRuntime().exec("./printCamerasMacOs");
Reader r = new InputStreamReader(process.getInputStream());
BufferedReader in = new BufferedReader(r);
while((line = in.readLine()) != null) {
cameras.add(line);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
에 대한
user$ cc -framework Foundation -framework AVFoundation -o printCameras main.m
user$ ./printCameras
uid:0xfd1200000c4562f1_name:USB 2.0 Camera
uid:0xfa20000005ac8509_name:FaceTime HD Camera (Built-in)
snippt를 컴파일 udev 규칙을 사용하여 OS 쪽에서 카메라 순서를 수정하십시오. 하지만 Mac OS에는 udev가 없기 때문에 실험하지 않았습니다.
깔끔한 ... 리눅스에는별로 적용 할 수 없지만 멋진 솔루션입니다. 앞으로의 검색 사용자를 위해 샘플 코드를 게시 할 수 있다고 생각하십니까? – Yeraze