我正在使用mac book并且有一个用C ++编写的程序,该程序是从网络摄像头中提取连续的帧。然后使用opencv函数对提取的帧进行灰度级和平滑。之后,我将使用CVNorm找出2帧之间的相对差异。我正在使用videoCapture类。
我发现帧速率是30fps并且使用CVNorm,连续帧之间获得的相对差异大多数时间都小于200.
我正在尝试在xcode上做同样的事情,以便在ipad上实现该程序。这次我使用AVCaptureSession,执行相同的步骤但我意识到2帧之间的相对差异要高得多(> 600)。
因此我想了解videoCapture类的默认设置,我知道我可以使用cvSetCaptureProperty编辑设置但我找不到它的默认设置。之后,我将它与AVcaptureSession的设置进行比较,并希望找出为什么当我使用这两种方法来提取我的框架时CVNorm存在如此巨大的差异。
提前致谢。
答案 0 :(得分:0)
OpenCV的VideoCapture
类只是一个简单的包装器,用于从相机捕获视频或读取视频文件。它建立在几个多媒体框架(avfoundation,dshow,ffmpeg,v4l,gstreamer等)之上,完全隐藏在外面。问题来自这里,很难在不同的平台和多媒体框架下实现相同的捕获行为。共同的(捕获)属性很差,设置它们的值只是建议而不是要求。
总之,默认属性在不同平台下可能不同,但在AV Foundation框架的情况下:
cvCreateCameraCapture_AVFoundation(int index)
函数将在iOS下创建一个CvCapture
实例,该实例在cap_qtkit.mm
中定义。您似乎无法change the sampling rate,仅支持CV_CAP_PROP_FRAME_WIDTH
,CV_CAP_PROP_FRAME_HEIGHT
和DISABLE_AUTO_RESTART
。
grabFrame()
实施如下。我绝对不是Objective-C专家,但它似乎等到捕获更新图像或超时发生。
bool CvCaptureCAM::grabFrame() {
return grabFrame(5);
}
bool CvCaptureCAM::grabFrame(double timeOut) {
NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init];
double sleepTime = 0.005;
double total = 0;
[NSTimer scheduledTimerWithTimeInterval:100 target:nil selector:@selector(doFireTimer:) userInfo:nil repeats:YES];
while (![capture updateImage] && (total += sleepTime)<=timeOut) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:sleepTime]];
}
[localpool drain];
return total <= timeOut;
}