我目前正在开发一个Android人脸检测应用,我想知道如何有目的地降低捕获帧速率。目前大约是30fps,我真正需要的是5-10fps。这样,我就不需要用尽可用于其他任务的其他处理。

我想知道Thread.sleep()是否是完成技巧所需的全部,or should I look into setting it via cvSetCaptureProperty(CvCapture* capture, int property_id, double value)吗?我读到它虽然只能在某些相机上使用,但在大多数情况下是没有用的...

我也读过有关设置最大帧大小(例如mOpenCvCameraView.setMaxFrameSize(640, 480);)的信息,但是...这样做对我来说没有任何意义?

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

    mRgba = inputFrame.rgba();
    mGray = inputFrame.gray();

    if (mAbsoluteFaceSize == 0) {
        int height = mGray.rows();
        if (Math.round(height * mRelativeFaceSize) > 0) {
            mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);
        }
        mNativeDetector.setMinFaceSize(mAbsoluteFaceSize);
    }

    MatOfRect faces = new MatOfRect();

    if (mDetectorType == JAVA_DETECTOR) {
        if (mJavaDetector != null)
            mJavaDetector.detectMultiScale(mGray, faces, SCALE_FACTOR, MIN_NEIGHBOURS, 2,
                    new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());
    }
    else if (mDetectorType == NATIVE_DETECTOR) {
        if (mNativeDetector != null)
            mNativeDetector.detect(mGray, faces);
    }
    else {
        Log.e(TAG, "Detection method is not selected!");
    }

    //put thread to sleep to slow capture?
    try {
        Thread.sleep(50);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return mRgba;
}

任何意见是极大的赞赏!谢谢。

最佳答案

我不建议您使用cvSetCaptureProperty(),因为它的行为非常夸张。

如果最后一个时间戳与现在的时间戳之间的差小于100毫秒,则应该将最后一个到达(并处理)的帧的时间戳记注册到onCameraFrame()并从事件处理程序返回。

10-08 05:02