在OpenCV + Linux中解决Firewire相机的顺序

时间:2013-08-22 21:25:48

标签: opencv firewire

我有4台Unibrain Fire-I相机以菊花链形式连接到我的电脑(Ubuntu 12.10),还有一个用OpenCV编写的应用程序,它现在可以读取其中2个相机的帧。但是,我发现每次将火线连接器插入/拔出计算机时,地址都会发生变化。在一次运行中cv :: VideoCapture中标识为“0”的内容在下一次运行中更改为数​​字3。

是否有更好的方法来识别使用数字更可靠的相机?

1 个答案:

答案 0 :(得分:0)

我对VideoCapture的索引有类似的问题。我有4个USB网络摄像头,我需要知道哪个网络摄像头对应哪个索引。 OpenCV不接缝以支持任何相机识别。我正在使用Mac OS 10.8所以我无法为你提供Ubuntu的修复,但也许我的解决方案可以给你提示在哪里看。 我查看了OpenCV源代码,其中opencv正在检索相机信息并找到了Mac OS-framework-(AVFoundation)。使用此框架,我设法获得网络摄像头及其硬件ID的顺序。此顺序对应于VideoCapture类的摄像机索引,从而使索引更改,例如重启后不再是问题。

编辑:我的MacOS解决方案: 由于我正在使用java并且我不想使用jna或jni构建包装器,因此我创建了一个简单的objective-c命令行工具,它在控制台上打印摄像机的id。然后我通过java中的 Runtime.getRuntime()。exec()执行命令行工具。

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

编译

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 for java

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

Linux的替代解决方案可能是使用udev规则来修复操作系统端的摄像头顺序。但我没有尝试过,因为Mac OS缺乏udev。