2015-04-08 80 views
0

我正在使用mac书,并有一个用C++编写的程序,该程序是从网络摄像头提取连续帧。然后使用opencv函数对提取的帧进行灰度化和平滑处理。之后,我会使用CVNorm来找出2帧之间的相对差异。我正在使用videoCapture类。opencv videocapture默认设置

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

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

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

在此先感谢。

+0

看到这个答案很有意思,'enum'的默认值可以在highgui_c.h中找到,但我一直在努力寻找和设置这些值。 – GPPK

回答

0

OpenCV的VideoCapture类只是一个简单的包装从捕捉摄像机的视频或阅读视频文件。它建立在几个多媒体框架(avfoundation,dshow,ffmpeg,v4l,gstreamer等)上,并且完全隐藏它们。问题来自于这里,在不同的平台和多媒体框架下实现相同的捕获行为是非常困难的。 (捕获)属性的常见集合很差,并且设置它们的值只是一个建议而不是要求。

总之,默认属性可以在不同的平台上不同,但在AV Foundation框架的情况下:

cvCreateCameraCapture_AVFoundation(int index)功能将创建的iOS,这是在cap_qtkit.mm定义下CvCapture实例。看起来像你不能change the sampling rate,只支持CV_CAP_PROP_FRAME_WIDTH,CV_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; 
} 
+0

感谢您的详细解释! :) – lkleung1