opencv videocapture默认设置

时间:2015-04-08 06:01:20

标签: c++ opencv

我正在使用mac book并且有一个用C ++编写的程序,该程序是从网络摄像头中提取连续的帧。然后使用opencv函数对提取的帧进行灰度级和平滑。之后,我将使用CVNorm找出2帧之间的相对差异。我正在使用videoCapture类。

我发现帧速率是30fps并且使用CVNorm,连续帧之间获得的相对差异大多数时间都小于200.

我正在尝试在xcode上做同样的事情,以便在ipad上实现该程序。这次我使用AVCaptureSession,执行相同的步骤但我意识到2帧之间的相对差异要高得多(> 600)。

因此我想了解videoCapture类的默认设置,我知道我可以使用cvSetCaptureProperty编辑设置但我找不到它的默认设置。之后,我将它与AVcaptureSession的设置进行比较,并希望找出为什么当我使用这两种方法来提取我的框架时CVNorm存在如此巨大的差异。

提前致谢。

1 个答案:

答案 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_WIDTHCV_CAP_PROP_FRAME_HEIGHTDISABLE_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;
}