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