我有4台Unibrain Fire-I相机菊花链连接到我的电脑上(Ubuntu 12.10),还有一个用OpenCV编写的应用程序,现在可以读取其中2台相机的帧。然而,我发现每次我插上/拔下电脑的火线连接器时,地址都会发生变化。在一次运行中,cv::VideoCapture中标识为"0"的内容在下一次运行中将更改为数字3。
有没有比使用数字更可靠的更好的方法来识别摄像头?
我在VideoCapture的索引方面也遇到了类似的问题。我有4个USB网络摄像头,我需要知道哪个网络摄像头对应哪个索引。OpenCV不缝合以支持相机的任何标识。我使用的是Mac OS 10.8,所以我不能为你提供Ubuntu的修复程序,但也许我的解决方案可以给你一些提示。我在OpenCV源中查找了OpenCV检索相机信息的地方,找到了Mac OS框架-(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("%sn", [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)
java 的snippt
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操作系统缺少udev。