2013-08-22 4 views
1

내 컴퓨터 (Ubuntu 12.10)에 4 대의 Unibrain Fire-I 카메라가 데이지 체인으로 연결되어 있고 OpenCV로 작성된이 카메라 중 2 대에서 프레임을 읽는 앱이 있습니다. 그러나 Firewire 커넥터를 컴퓨터에 연결/분리 할 때마다 주소가 변경된다는 것을 알게되었습니다. cv :: VideoCapture에서 한 번에 "0"으로 식별되는 것은 다음 번에 3 번으로 바뀝니다.주소 OpenCV + Linux에서 Firewire 카메라 주문

숫자를 사용하여 더 신뢰할 수있는 카메라를 식별하는 더 좋은 방법이 있습니까?

답변

0

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가 없기 때문에 실험하지 않았습니다.

+0

깔끔한 ... 리눅스에는별로 적용 할 수 없지만 멋진 솔루션입니다. 앞으로의 검색 사용자를 위해 샘플 코드를 게시 할 수 있다고 생각하십니까? – Yeraze